数据仓库设计问题

时间:2010-08-12 13:06:06

标签: database-design data-warehouse olap

我正在开发一个数据仓库并遇到了一个我不确定如何修复的问题。当前架构定义如下:

DimInstructor< - 教师的维度表 DimStudent< - 学生的维度表

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

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

DimInstructor表包含:

InstructorDWID< - 输入DW时的标识字段 InstructorID< - 来自OLTP数据库的教师ID

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

所以我的问题是,如何从DimLesson引用讲师?我使用InstructorDWID吗?如果是这样,我应该在DimInstructor中为教师提供2个条目,当我想要查看特定教师的所有课程时,它会使查询更复杂。

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

您在此处描述的内容通常称为类型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。

答案 1 :(得分:1)

保罗,

有多种方法可以解决这个问题。您可以使用有效的日期/非活动日期,序列号或版本号来区分具有相同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

答案 2 :(得分:0)

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