目录
前言
维度表属性随着时间而变化,好的数据模型应具有追踪维度变化的能力。Kinball在维度建模工具箱一书中提出7种缓慢变化维度(Slowly changing Dimension, SCD)处理技术。本文逐一详解7种设计方法,其中类型1-4为基本设计方法,类型5-7由类型1-4相互组合形成。
维度属性不变的情况,在Kinball理论中成为类型0情况,如一个人的出生日期,这类属性一旦有值,将不在变化,可以视为常量。
为辅助讲解,本文设定一个案例场景:为统计不同员工的计算资源消耗情况,存在一张员工维度表和一张任务计算事实表。
其中员工基本属性:
代理键 | 员工编号 | 姓名 | username | 部门名称 | ··· |
事实表属性:
任务id | 执行人 | 资源消耗 | ··· |
员工的部门可能改变,接下来讨论员工部门改变后,数据如何处理。
基本设计方法
类型1:重写
针对变化的属性,直接重写原有的值。
例如,张三原部门为“数据开发1组”,在2021年1月1日部门变动为“数据开发2组”,对应数据的调整为:
改变前:
代理键 | 员工编号 | 姓名 | username | 部门名称 |
1009 | NO001 | 张三 | zhangsan1 | 数据开发1组 |
改变后:
代理键 | 员工编号 | 姓名 | username | 部门名称 |
1009 | NO001 | 张三 | zhangsan1 | 数据开发2组 |
新的部门值覆盖原有的值,代理键不变,事实表关联同一个键值。
这种实现方式无论ETL操作还是业务使用均很简单,但是缺点也很明显,无法追踪数据的历史状态。如分析人员希望1月1号之前的数据统计在“数据开发1组”部门中,则无法实现。
同时对于下游BI应用或汇总表,维度变化后需要重刷下游,否则进行上卷/下钻操作时可能出现数据不一致情况。
类型2:增加新行
针对每个变化的属性,增加一个新行。也被称为拉链表,在业内广泛使用。
属性变化时,保留原有记录同时使用最新值新增一条记录。维表设计时需额外增加几列,分别表示当前记录的生效起始时间、生效结束时间和是否当前行标识。
改变前:
代理键 | 员工编号 | 姓名 | username | 部门名称 | 行生效日期 | 行失效日期 | 是否当前行 |