我正在开发一个数据仓库并遇到了一个我不确定如何修复的问题。当前架构定义如下:
DimInstructor< - 教师的维度表 DimStudent< - 学生的维度表
我想实现一个场景,如果教师的详细信息在我的OLTP数据库中发生变化,我想在DimInstructor表中添加一条新记录,以便出于历史报告原因。
现在,我想创建一个名为DimLesson的课程维度表。在DimLesson中,我想创建一个对教师的引用。
DimInstructor表包含:
InstructorDWID< - 输入DW时的标识字段 InstructorID< - 来自OLTP数据库的教师ID
现在,我无法将InstructorID作为主键,因为它不能保证是唯一的(如果教师更改其名称,DW中将有2条具有相同InstructorID值的记录)。
所以我的问题是,如何从DimLesson引用讲师?我使用InstructorDWID吗?如果是这样,我应该在DimInstructor中为教师提供2个条目,当我想要查看特定教师的所有课程时,它会使查询更复杂。
任何帮助将不胜感激!
答案 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作为主键或列的组合