一,什么是渐变维
维度可以根据变化剧烈程度主要分为无变化维度、缓慢变化维度和剧烈变化维度。例如一个人的相
关信息,身份证号、姓名和性别等信息数据属于不变的部分,政治面貌和婚姻状态属于缓慢变化部分, 而工作经历、工作单位和培训经历等在某种程度上属于急剧变化字段。 大多数维度表随时间的迁移是缓慢变化的。比如增加了新的产品,或者产品的ID号码修改了,或者 产品增加了一个新的属性,此时,维度表就会被修改或者增加新的记录行。这样,在设计维度和使用维度的过程中,就要考虑到缓慢变化维度的处理。
缓慢渐变维,即维度中的属性可能会随着时间发生改变,比如包含用户住址Address的 DimCustomer维度,用户的住址可能会发生改变,进而影响业务统计精度,DimCustomer维度就是缓慢渐变维(SCD)。
SCD有三种分类,我们这里以顾客表为例来进行说明:
假设在第一次从业务数据库中加载了一批数据到数据仓库中,当时业务数据库有这样的一条顾客的
信息。
顾客 BIWORK ,居住在北京,目前是一名 BI 的开发工程师。假设 BIWORK 因为北京空气质量 PM2.5 等原因从北京搬到了三亚。那么这条信息在业务数据库中应该被更新了。
那么当下次从业务数据库中抽取这类信息的时候,数据仓库又应该如何处理呢?我们假设在数据仓库中实现了与业务数据库之间的同步,数据仓库中也直接将词条数据修改更新。后来我们创建报表做一些简单的数据统计分析,这时在数据仓库中所有对顾客 BIWORK 的销售都指向了 BIWORK 新的所在地 - 城市三亚,但是实际上 BIWORK 在之前所有的购买都发生在 BIWORK 居 住在北京的时候。通过这个简单的例子,描述了因一些基本信息的更改可能会引起数据归纳和分析出现的问题。
二,SCD1(缓慢渐变类型1)
通过更新维度记录直接覆盖已存在的值。不维护记录的历史。一般用于修改错误的数据在数据仓库中,我们可以保持业务数据和数据仓库中的数据始终处于一致。可以在 Customer 维 度中使用来自业务数据库中的 Business Key - CustomerID 来追踪业务数据的变化,一旦发生变化那么就将旧的业务数据覆盖重写。DW 中的记录根据业务数据库中的 CustomerID 获取了最新的 City 信息,直接更新到 DW 中。
三,SCD2(缓慢渐变类型2)
在源数据发生变化时,给维度记录建立一个新的“版本”记录,从而维护维度历史。SCD2不删除、不
修改已存在的数据。SCD2也叫拉链表。
当然在数据仓库中更多是对相对静态的历史数据进行数据的汇总和分析,因此会尽可能的维护来自
业务系统中的历史数据,使系统能够真正捕获到这种历史数据的变化。以上面的例子来说,可能需要分
析的结果是 BIWORK 在 2012年的时候购买额度整体平稳,但是从2013年开始购买额度减少了,出现
的原因可能与所在的城市有关系,在北京的门店可能比在三亚的门店相对要多一些。
像这种情况,就不能很简单在数据仓库中将 BIWORK 当前所在城市直接更新,通过起始时间来标
识,Valid To(封链时间)为 NULL 的标识当前数据,也可以用2999,3000,9999等等比较大的年份。
四,SCD3(缓慢渐变类型3)
实际上SCD1 and 2 可以满足大多数需求了,但是仍然有其它的解决方案,比如说 SCD3。 SCD3
希望只维护更少的历史记录。
比如说把要维护的历史字段新增一列,然后每次只更新 Current Column 和 Previous Column。
这样,只保存了最近两次的历史记录。但是如果要维护的字段比较多,就比较麻烦,因为要更多的
Current 和 Previous 字段。所以 SCD3 用的还是没有 SCD1 和 SCD2 那么普遍。它只适用于数据的 存储空间不足并且用户接受有限维度历史的情况