MiBDP,数据开发、项目团队、数据应用和产品在路上,金融保险、互联网网游、电商、新零售行业、大数据和AI在路上。对数仓、模型、ETL、数据产品应用了解。DTCC 2013演讲嘉宾,曾做过两款大获好评的数据产品平台。知识星球ID:35863277
分类: 服务器与存储
2010-12-22 10:10:49
Slowly Changing Dimension 简称 SCD 是数据仓库建模和处理过程中一个很重要的概念,因为数据仓库系统的主要功能是对历史数据进行汇总和分析,所以保存历史记录的变化是很重要的。SCD是用来处理 Dimension 表变化的一种设计理论。SCD 通常使用三种类型:
类型1 (Type 1): 覆盖旧记录。有些Dimension 表从业务上讲不需要保存历史记录或者只需要对原有记录进行修改。比如说 Customer 表中有 Customer 地址的属性,原有的地址输入错误我们需要修改这个属性而不需要对原有的错误地址进行保存,这个时候就可以使用 SCD Type 1。需要注意的是 SCD 是一种修改 Dimension 表记录的方法,而不是设计 Dimension 结构的方法,但是在设计 Dimension 表的结构的时候我们通常需要考虑这个 Dimension 表是否需要处理 SCD 的三种类型。
类型2 (Type 2): 增加新记录。Type 2 是精确捕获Dimension 表历史变化的一种标准的方法,它通过对数据源表的Change Data Capture (CDC) 机制来捕获数据源的变化,然后在 Dimension 表中插入一个新的记录再使旧的相应的记录实效。通常能够处理 SCD Type2 的表包含下面的字段:
在实际的设计中不一定全部包括上面的字段,但是 Start Date, End Date 和 Active Flag 是一定要包括的。如下图所示的一个例子
Rob Walters 有两条记录,第一条记录从 1998-01-05 至 2000-06-30 在 Tool Design 部门工作,第二条记录显示从 2006-06-30 至今 (EndDate 为空) 在 Engineering 部门工作,而 Status 列跟据 EndDate 是否为空表示为 ‘Current’ 或者 Null,如果为 Null, 则表示该记录已经过期。通常,Start Date 和Data Changed 采用系统时间,或者直接将该属性的默认值设计为系统时间;记录的终止时间默认值是NULL 或者是 12-31-9999 (当前数据属性的最大值),取决于 Cube 中的设计。
类型3 (Type 3): 增加新字段。有时候我们需要一种简便的方法来在一条记录上跟踪 Dimension 表属性的变化,也就是说在当前的记录上同时显示当前的属性值和过去的属性值,这时候我们就需要增加一个新的字段来处理这种需要,如下图所示:
在图中,使用 PreviousDepartmentName 来显示当前DepartName 的上一个值。
在实际应用中 Type 1 和 Type 2 是最为常用的,也常常会在同一个 Dimension 表中的不同的属性上实现不同的 SCD, 比如说在上图的例子中,如果 LastName 输入错误了,就不需要对错误的记录进行保存,直接用正确的值替换,这就是 Type 1; 如果DepartmentName 改变了,则需要保存它的历史记录,就是 Type 2; 所以这种处理方法也叫做 Hybrid SCD – 混合型 SCD。需要注意的是,在实现 SCD Type 1 的表上,如果这个Dimension 表同时包含了处理 SCD Type 2 的结构,我们需要将所有的该属性的值进行修改。比如在图中,如果要修改 Rob Walters 的 LastName, 则需要将所以的他的记录全部修改,不论记录的Status 值是什么。
实现 SCD, 需要在数据源上实现有效的 Changing Data Capture (CDC)机制,我的下一篇文章将介绍 CDC 的一些基本知识。
: