作者:莎仕比亚的围脖 | 来源:互联网 | 2024-10-31 19:15
在数据仓库架构中,缓慢变化维度(SCD)是一种广泛应用的技术手段。该技术处理的是那些随时间逐步变化的维度属性,确保在进行商业智能(BI)分析时能够准确反映特定历史时间点的数据状态。通过合理设计SCD,可以有效提升数据仓库的性能与准确性,同时简化数据管理和维护流程。
数据仓库中,缓慢渐变维度是一种经常使用到的方案。
“渐变”,即为逐渐变化的维度,因为日常应用中,维度属性是随时可能发生变化的,而BI统计时,又可能是需要历史某个时间点的维度属性值。所以这种情况下,就需要我们记录下这个变化信息,于是渐变维度就出现了。
“缓慢”两个字,也是需要注意的,仅有缓慢变化的才适用于这种方案。如果是每天每时每刻都在变化的就不适合这种方案了,因为那样会产生太多太多的记录,导致维度表记录过多,影响效率。
下面就先来看一下它的表结构设计:
与渐变相关的几个字段:
SCD_StartDate - 该记录生成时间
SCD_EndDate - 该记录废弃时间
SCD_IsActive - 该记录是否当前激活状态
SCD_Version- 该记录当前版本号
GetItAct - 数据更新时间
外键可以先不看,它与缓慢渐变维度关系不大。
业务字段:
DeaprtNo为业务主键,一般不会发生变化。
DepartName为部门名称,不过我们并不关心它的历史状态,所以需设置为实时更新。其他ENName类似。
DepartType我们关注它的历史,所以需用ETL工具,设置为渐变更新。
ParentDepartID同样关注历史,需设置渐变更新。
可能的更新情况如下:
1. DepartName变化,此时不会产生新的记录,仅会做如下操作:
a)更新当前最新记录的DepartName为最新。
b)根据业务主键DepartNo,更新所有同No的历史记录的DepartName为最新。
2.ParentDepartID变化时,则会产生新的记录,此时会做如下操作:
a) 修改旧记录的EndDate为当前时间
b)修改旧记录的isActive=0
c)添加一条新的记录,StartDate=当前时间,isAtive=1,Version=旧Version+1
如下图:
维度表的使用:
1.取最新版数据
select * from dm_depart_dim d
where d.SCD_IsActive = 1
2.取历史数据 --2013-02-12为时间点
select * from dm_depart_dim d
where '2013-02-12' between d.SCD_StartDate and d.SCD_EndDate
or (d.SCD_EndDate is null and '2013-02-12' >=d.SCD_StartDate)
3.建立事实表与维度表关联
如取最新数据,根据SQL1获取最新数据的ID,放入事实表维度ID外键中
如取历史数据,根据SQL2获取历史数据的ID,放入事实表维度ID外键中