缓慢变化维(Slowly Changing Dimensions)
缓慢变化维是维度技术中用于描述维度变化情况的一种分类。
什么是SDC?
在现实的实施中
先说一下缓慢变化维的概念。缓慢变化维(Slowly Changing Dimensions)指的是:维度中的某一个或某几个属性不是固定不变,会随着时间的推移发生低频次改变。
打个比方,小李在魔都奋斗多年,成功买房落户,那么小李的户籍地址就会发生变化;如果把自然人当作数据分析时的一个维度,那么户籍地址属性的就是一类SCD。
维度建模怎么处理SCD
维度建模的构建者和大神KimBall在他的著作中,对SCD的处理和构建方法经过系统性的总结,总共8种,这8种方法单一模式的模型构建方式,也有混合的模型构建方式。
简要的介绍下这8种方式:
- 类型0-原样保留属性
- 类型1-更新属性
- 类型2-增加新维度行
- 类型3-保留原始并增加新属性列
- 类型4-增加微型维度
- 类型5-微型维度+更新属性混合
- 类型6-类型2+类型3混合
- 类型7-双类型2+类型3混合
本期先分享类型0到类型3
SCD的实例
我们以一家跨境零售公司为例,基于公司普遍的数据报表需求,来学习下有哪些方案可以跟踪同一维度中属性的变更,以及使用建模构建中应该主要的事项。
我们以武侠小说中的大侠帮来模拟这个过程
假设有下面的大侠排行榜
大侠ID | 大侠名称 | 所属门派 |
---|---|---|
1001 | 阳顶天 | 明教 |
1002 | 张无忌 | 武当 |
后来,张无忌加入明教
大侠帮的数据变更为下面的情况:
大侠ID | 大侠名称 | 所属门派 |
---|---|---|
1001 | 阳顶天 | 明教 |
1002 | 张无忌 | 明教 |
类型0-原样保留属性
业务系统的属性变化,但是仓库中仍然保留原始的记录;进而事实表中仍然是在按照原始值分类。
按照类型1,数据仓库中的维度表情况如下:
- 变化后
大侠ID | 大侠名称 | 所属门派 |
---|---|---|
1001 | 阳顶天 | 明教 |
1002 | 张无忌 | 武当 |
可以看到虽然业务系统变化了,但是数据仓库中仍然使用原来的值
适用范围
适用哪些不需要展现变化值的场景。但在实际应用过程中,这类是用的最少的。
类型1-更新属性
对维度中的属性根据业务系统数据的变化而重写。这种方式的优点是,属性值使用反应当前最新值情况。当然缺点也很明显,属性指的历史记录将会消失,历史属性无法得到反应。
按照类型1,维度表情况如下:
- 变化后
大侠ID | 大侠名称 | 所属门派 |
---|---|---|
1001 | 阳顶天 | 明教 |
1002 | 张无忌 | 明教 |
适用范围
类型1是一类最常采用的SCD的模型设计方式,应用场景多样,对那些对历史值不敏感,只关注最新属性的系统而言,是最易理解和实现的建模方式
类型2-增加新维度行
这种方式指的是当维度发生变化时,保留以前的记录,同时新增一行,采用不同的主键,并标识为最新的维度;
按照类型2,维度表情况如下:
- 变化后
维度键 | 大侠ID | 大侠名称 | 所属门派 | 行有效时间 | 行失效时间 | 当天行标识 |
---|---|---|---|---|---|---|
1001 | 1001 | 阳顶天 | 明教 | 1970-01-01 | 2099-12-31 | new |
1002 | 1002 | 张无忌 | 武当 | 2021-01-10 | 2099-12-31 | old |
1003 | 1002 | 张无忌 | 明教 | 1970-01-01 | 2021-01-09 | new |
这种方式,事实表只需要根据不同的生效及失效时间就能获取该时间段内的属性值,做到反映历史变化情况。但是这种方式,对SQL取数的查询效率、用户理解上有一点难度。
类型3-保留原始并增加新属性列
在维度表中增加一列新属性,原先的属性列中存放更新前的属性值,新增的属性列中存储最新变更的属性值。使用类型3可以在新旧2个版本的属性值中作切换。
- 变化后
大侠ID | 大侠名称 | 当前所属门派 | 原先所属门派 |
---|---|---|---|
1001 | 阳顶天 | 明教 | 明教 |
1002 | 张无忌 | 明教 | 武当 |
结束语
以上介绍了4中常见的缓慢变化维的处理方式。其它的后续在一一介绍。总之维度建模技术中,缓慢变化维的处理方式有不少,随着时代的发展,也有更多。各位在数仓建设中应该选择最适合自身需求的设计方式。