缓慢变化维解决方案
在以维度建模的数据仓库中,有一种概念叫做缓慢变化维,Slowly Changing Dimension。缓慢变化维的提出是因为在现实世界中,维度的属性并不是静态的,它会随着时间的流失发生缓慢的变化。这种随时间发生变化的维度我们一般称之为缓慢变化维,并且把处理维度表的历史变化信息的问题称为处理缓慢变化维的问题,有时也简称为处理SCD的问题。
处理的一般方法:
1.直接覆盖历史数据。
如果该维度数据的变化并不是你所关心的,那么可以采用直接覆盖历史数据的方法。比如,员工表中某员工的政治面貌发生变化,你不关心这一点则可以直接覆盖历史数据。
2.保留历史纪录并添加一个标志位。
该方法直接添加新纪录,并将历史纪录的标志位设为Inactive,新纪录标志位设为Active。如果需要还可以附上时间戳,表明旧纪录是何时失效的。
3.利用不同的字段保存不同值。
新加一个历史值字段,一个时间戳字段,一个新值字段。该方法若要保存若干条历史纪录则字段数会很多,不清晰明了。
4.新建一个表来保存历史纪录。
相当于把方法2中Inactive的数据保存于另外一张表中,原表中只保存Active的数据。
5.非常规混合方法。
该方法在方法2的基础上添加一个版本的字段,当前版本值为0,历史版本为1,2,3,4...新数据插入时则版本号都加1. 并且在事实表中,为每条纪录添加一个版本号字段和维度表对应,这样可以解决维度表和事实表的多对多关系而不用使用时间戳作为查询的条件。
处理的一般方法:
1.直接覆盖历史数据。
如果该维度数据的变化并不是你所关心的,那么可以采用直接覆盖历史数据的方法。比如,员工表中某员工的政治面貌发生变化,你不关心这一点则可以直接覆盖历史数据。
2.保留历史纪录并添加一个标志位。
该方法直接添加新纪录,并将历史纪录的标志位设为Inactive,新纪录标志位设为Active。如果需要还可以附上时间戳,表明旧纪录是何时失效的。
![]() |
3.利用不同的字段保存不同值。
新加一个历史值字段,一个时间戳字段,一个新值字段。该方法若要保存若干条历史纪录则字段数会很多,不清晰明了。
![]() |
4.新建一个表来保存历史纪录。
相当于把方法2中Inactive的数据保存于另外一张表中,原表中只保存Active的数据。
![]() |
5.非常规混合方法。
该方法在方法2的基础上添加一个版本的字段,当前版本值为0,历史版本为1,2,3,4...新数据插入时则版本号都加1. 并且在事实表中,为每条纪录添加一个版本号字段和维度表对应,这样可以解决维度表和事实表的多对多关系而不用使用时间戳作为查询的条件。
![]() |