下面我们分别来学习维度表设计和事实表设计:
• 维度表设计:代理键,稳定维度,缓慢渐变维,拉链表
• 事实表设计:事实表设计,明细事实表,聚合事实表
• 数据仓库之拉链表详解
1.维度表设计
1.1 代理键
维度表中必须有一个能够唯一标识一行记录的列(最好是原子性的列,不要是组合键), 通过该列维护维度表与事实表之间的关系,一般在维度表中业务主键符合条件可以当作维度主键。
但是,数据仓库是整个公司数据的整合,这会涉及到多个数据源有相同维度,那么就会 出现以下两个问题:
• 当整合多个数据源的维度时,不同数据源的业务主键重复怎么办?
• 涉及维度拉链表时,同一主体多条记录,业务键重复怎么办?

如上图所示,业务键重复,我们可以引入代理键,如下表所示:

把多个系统的数据复合在一起,同时再维护一个代理键,而且代理键在这个维度表里是 唯一标识一条记录的,类似于业务系统的业务键。
代理键是由数据仓库处理过程中产生的、与业务本身无关的、唯一标识维度表中一条 记录并充当维度表主键的列,也是描述维度表与事实表关系的纽带。
在设计有代理键的维度表中,事实表中的关联键是代理键而不是原有的业务主键,即 业务关系是靠代理键维护,这样有效避免源系统变化对数仓数据对影响。
在实际业务中,代理键通常是数值型、自增的值。
1.2 稳定维度
部分维度表的维度是在维度表产生后,属性是稳定的、无变化的。比如时间维度、区域维度等,针对这种维度,设计维度表的时候,仅需要完整的数据,不需要天的快照数据, 因为当前数据状态就是历史数据状态。
1.3 缓慢渐变维
维度数据会随着时间发生变化,变化速度比较缓慢,这种维度数据通常称作缓慢渐变维,例如电商平台的用户维度表,用户可能会随着时间推移改变收件地址,因此用户维度表 中的收件地址就是一个缓慢变化维。由于数据仓库需要追溯历史变化,尤其是一些重要的数 据,所以历史状态也需要采取一定的措施进行保存,保存历史状态的方式有以下三种:
• 每天保存当前数据的全量快照数据(每天一个新增分区),该方案适合数据量较小 (根据公司具体的配置而定)的维度,使用简单的方式保存历史状态。
• 在维表中添加关键属性值的历史字段,仅保留上一个的状态值。可能同时有多个属 性都非常重要,而且只能追溯上一个数据,不是所有的历史数据,这种范式应用场景较少。
• 拉链表:当维度数据发生变化时,将旧数据置为失效,将更改后的数据当作新的 记录插入到维度表中,并开始生效,这样能够记录数据在某种粒度上的变化历史。
1.4 拉链表
将数据的变更当做流水记录下来 ,旧的设为失效,新的设为生效,如果粒度为天,那