一.什么是缓慢变化维?
缓慢变化维(Slowly Changing Dimensions,SCD): 它的提出是因为在现实世界中,维度的属性并不是静态的,它会随着时间的流失发生缓慢的变化。
这种随时间发生变化的维度,一般被称为缓慢变化维;并且把处理维度表的历史变化信息的问题称为处理缓慢变化维的问题,有时也简称为处理SCD的问题。
二.怎样处理缓慢变化维?
处理方法通常分为3种:
假设有这样一条数据:
id | name | city |
---|---|---|
101 | luna | Chongqing |
现在luna离开重庆,前往成都分公司工作,所以需要对city数据进行更新
第一种:直接覆盖原值
id | name | city |
---|---|---|
101 | luna | Chengdu |
这样处理,最容易实现,但是没有保留历史数据,无法分析历史变化信息
第二种:添加维度行
当有维度属性发生变化时,生成一条新的维度记录,如下:
id | name | city |
---|---|---|
101 | luna | Chongqing |
101 | luna | Chengdu |
但是这样,当与别的表通过id关联时,有两个101的id数据,这样是有问题的;所以就需要代理键的支持。(在数据仓库的术语里面,这个唯一标识数据仓库表记录的键我们称之为 Surrogate Key 代理键)
sk_id | id | name | city |
---|---|---|---|
001 | 101 | luna | Chongqing |
002 | 101 | luna | Chengdu |
现在每条数据都唯一,但又一个问题,现在不知道哪个是当前在用的数据,虽然可以通过代理键找最大的(因为主键往往是自增的,最大的通常是最新的数据),但某些情况下要插入历史数据就不好找了,所以在维度表中加入时间序列,用NULL来标识哪条是当前最新数据,有变化再进行更新。
sk_id | id | name | city | start_time | end_tinme |
---|---|---|---|---|---|
001 | 101 | luna | Chongqing | 2017/08/27 | 2018/06/20 |
002 | 101 | luna | Chengdu | 2018/06/20 | NULL |
第三种:添加属性列
id | name | curr_city | old_city |
---|---|---|---|
101 | luna | Chengdu | Chongqing |
这种方式的优点是,可以同时分析当前及前一次变化的属性值
总结:在实际建模中,我们可以联合使用三种方式,也可以对一个维度表中的不同属性使用不同的方式;这些都是需要根据实际情况来决定,但目的都是一样的,就是能够支持方便的分析历史变化情况。