热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据仓库架构中缓慢变化维度的优化设计策略

在数据仓库架构中,缓慢变化维度(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外键中


推荐阅读
author-avatar
莎仕比亚的围脖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有