缓慢变化维(SCD)处理方式

孤人 提交于 2021-02-17 04:21:42

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

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

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

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

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

更新前:
    emp_rid(代理键)  emp_id(自然键)   emp_name  position
    101212                   12345             Jack         Developer

    更新后:
    emp_rid(代理键)  emp_id(自然键)   emp_name  position
    101212                   12345             Jack          Manager

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

更新前:
    emp_rid(代理键)  emp_id(自然键)   emp_name  position   start_date   end_date
    101212                 12345             Jack            Developer  2010-2-5    2012-6-12

    更新后:
    emp_rid(代理键)  emp_id(自然键)   emp_name  position   start_date   end_date
    201245                 12345             Jack            Manager     2012-6-12

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

更新前:
    emp_rid(代理键)  emp_id(自然键)   emp_name  position   old_position   
    101212                 12345             Jack               Developer  null

    更新后:
    emp_rid(代理键)  emp_id(自然键)   emp_name  position   old_position
    101212                 12345             Jack               Manager     Developer

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字段来记录上一次的住址就够了

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!