缓慢渐变维度的处理方式
  c30p1WSUdGLJ 2023年11月02日 19 0


    维度可以根据变化剧烈程度主要分为无变化维度、缓慢变化维度和剧烈变化维度。例如一个人的相关信息,身份证号、姓名和性别等信息数据属于不变的部分,政治面貌和婚姻状态属于缓慢变化部分,而工作经历、工作单位和培训经历等在某种程度上属于急剧变化字段。

    对于剧烈变化维度,通常情况下都是一分为二进行处理的,把其中不常变动的部分单独抽出来作为一个维表,按照缓慢变化维方式进行处理;另外一部分也单独抽取出来,通常作为维度的属性进行处理。

    大多数维度表随时间的迁移是缓慢变化的。比如增加了新的产品,或者产品的ID号码修改了,或者产品增加了一个新的属性,此时,维度表就会被修改或者增加新的记录行。这样,在设计维度和使用维度的过程中,就要考虑到缓慢变化维度的处理。

    缓慢渐变维度,即维度中的属性可能会随着时间发生改变,比如包含用户住址Address的DimCustomer维度,用户的住址可能会发生改变,进而影响业务统计精度,DimCustomer维度就是缓慢渐变维(SCD),对于SCD,处理方式通常有以下几种:

    Type 1:完全不记录历史变化信息,在ETL将数据载入SCD的时候,对于会产生变化的属性值直接覆盖,比如对于DimCustomer的Address,每次都会将新的地址update到该字段,因此这个SCD实际上总是最新的当前信息,却没能包含历史信息

    Type 2:通过添加记录来将每一次变化都记录到SCD中,每条记录都有两个字段(如Effective_start和Effective_end)表明该记录的有效期间,并且可以设定一个Active标志位字段,当该字段为True的时候表明这条记录是最新的状态,为False的时候表明该记录是历史记录,其有效期间可以通过Effective_start和Effective_end字段来查

    Type 3:通过对会发生变化的字段,添加相应的历史字段,来记录最近的变化而非全部变化。比如DimCustomer中有两个字段Address和Address_Old,第一个字段是用户的当前住址,后一个字段是用户之前一次的住址,显然,更久之前的信息就无法追溯了

    Type 4:除了一个记录当前信息的维度外,单独建立一个历史信息维度,该维度中需要包含有效期间字段(如Effective_start和Effective_end)

    Type 5:可以看到,对于Type 1/2/3,都是对于SCD中渐变属性的处理方式,而针对一个包含多字段的复杂的SCD,可能需要结合以上三种处理方式。比如对于DimCustomer中的用户联系方式属性email,如果业务上并不重要,那么这个字段可以采取Type 1的方式,即每次只保留最新的联络方式,覆盖原来的;假如业务中需要分析用户所在地Region,那么很可能需要用到Type 2,记录每一个Region的改变;而对于地址信息Address,可能并不需要追溯很久的变化,那么加一个Address_Old字段来记录上一次的住址就够了

    下面就先来举例一种方式(Type2)的结构设计:

缓慢渐变维度的处理方式_外键

与渐变相关的几个字段:

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

  如下图:

缓慢渐变维度的处理方式_字段_02


维度表的使用:

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外键中

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  Dk8XksB4KnJY   2023年12月23日   11   0   0 字段字段SQLSQL
c30p1WSUdGLJ