【问题标题】:Data Warehousing Design Question数据仓库设计问题
【发布时间】:2010-08-12 13:06:05
【问题描述】:

我正在开发一个数据仓库,但遇到了一个不知道如何解决的问题。当前架构定义如下:

DimInstructor

我想实现一个场景,如果教师的详细信息在我的 OLTP 数据库中发生更改,我想出于历史报告的原因在 DimInstructor 表中添加一条新记录。

现在,我想创建一个名为 DimLesson 的课程维度表。在 DimLesson 中,我想创建对讲师的引用。

DimInstructor 表包含:

InstructorDWID

现在,我不能将 InstructorID 设为主键,因为它不能保证是唯一的(如果讲师更改姓名,DW 中将有 2 条记录具有相同的 InstructorID 值)。

所以我的问题是,我如何引用 DimLesson 的讲师?我是否使用 InstructorDWID?如果是这样,我是否应该在 DimInstructor 中有 2 个讲师条目,当我想查看特定讲师的所有课程时,查询会变得更加复杂。

任何帮助将不胜感激!

【问题讨论】:

    标签: database-design data-warehouse olap


    【解决方案1】:

    您在这里描述的通常称为类型 2 维度。 Kimball 数据仓库书籍有关于类型 2 维度和类型 ETL 的完整部分——请阅读。

    首先要了解的是主键和业务键的区别。主键唯一标识表中的一行,而业务键唯一标识表描述的实体,如讲师。例如,如果讲师更改姓名,dimInstructor 表可能类似于:

    InstructorKey  InstructorBusinessKey  FirstName LastName  row_ValidFrom row_ValidTo   row_Status
      1234           jane_doe_7211           Jane     Doe       2000-03-11   2010-08-12     expired
      7268           jane_doe_7211           Jane     Smith     2010-08-12   3000-01-01     current
    

    现在,如果 dimLesson 是适合您的业务模型的设计(而不是有某种事实),dimLesson 将有一个名为 InstructorKey 的列。在 ETL 过程中,将新行 (7258) 传递到 dimInstructor 表时,将 dimLesson 中对第 1234 行的所有引用替换为 7268。

    【讨论】:

    • 谢谢达米尔。 dimLesson 表的设计类似于 dimInstructor 表。示例报告可能基于课程更改名称后课程预订增加还是减少?我认为您解释的方法似乎最有意义。
    【解决方案2】:

    保罗,

    您可以通过多种方式处理此问题。您可以使用生效日期/非活动日期、序列号或版本号来区分具有相同 InstructorID 的记录。

    捕获所有相关细节的 DIM 就像..

    create table DIM_INSTRUCTOR(
      instr_guid number, --populated through a sequence     -----Composite pk-Part1
      istr_oid   number, --direct id from the OLTP system   -----cmposite  pk-part2
      instr_name number,
      other_attr varchar2(25),
      eff_date   date,
      expiration_date date
    );
    

    instr_guid 直接由序列生成,独立于 OLTP 系统。

    这可以让您捕获给定讲师的所有详细信息。 您可以只使用 instr_guid 作为事实表的外键,但同时包含它们 (instr_guid,instr_guid) 会增加查询的便利性.. 这是 Datawarehousing 的目标之一。

    有用的链接:

    http://en.wikipedia.org/wiki/Surrogate_key http://en.wikipedia.org/wiki/Slowly_changing_dimension#Type_2

    【讨论】:

    • 谢谢。我将如何从另一个维度表中引用键?因此 DimLessons 表包含特定讲师的所有课程。课程表的功能相同,使用类型 2。
    • 维度表(通常)不应该相互引用。它们都是独立的实体,引用这些表的是事实表。据我了解,您的方案将在事实级别进行课程注册。每个班级注册都将是事实表中的一条记录。 Students_dim、instructors_dim、classes_dim 将包含相应的属性。注册事实将包含来自这些表中的每一个的键以及所有其他详细信息,例如注册日期等。
    • 我想我明白了。因此,如果我想基于讲师、学生、课程和课程预订创建架构,每个暗表(讲师、学生、课程)将相互独立并通过事实表链接?这是有道理的,但是如果生成的报告显示了一个没有人参加过的讲师的课程怎么办?如果事实表中没有记录,因为没有人参加,我如何将讲师链接到课程?
    【解决方案3】:

    使用 guid/uuid 作为主键或列组合

    【讨论】:

    • 您的意思是 InstructorDWID?该值将是唯一的,因为它是一个标识列。但是,如果讲师详细信息发生更改,该讲师将拥有多个 InstructorDWID。示例 - InstructorDWID 当前为 1,然后讲师将她的头衔从 Miss 更改为 Mrs。我们现在的 InstructorDWID 为 1 和 2。1 现在已过时,2 是当前的。现在引用 InstructorDWID 1 的课程已经过时,会发生什么情况?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 2016-07-09
    相关资源
    最近更新 更多