介绍
缓慢变化维,简称SCD(Slowly Changing Dimensions)
一些维度表的数据不是静态的,而是会 随着时间而缓慢地变化(这里的缓慢是相对事实表而言,事实表数据变化的速度比维度表快)
这种随着时间发生变化的维度称之为缓慢变化维
例子
| 用户ID | 用户名 | 出生日期 | 住址 |
|---|---|---|---|
| 114 | 张三 | 1988-09-08 | 北京市朝阳区 |
上面用户表的数据,可能会修改,如:将出生日期改成 1992-09-08。此时,用户维度表就发生了变化,就是缓慢变化维。
注意:不能是频繁发生变化、且无对比意义字段,如:dataTime字段,对于原始数据表这个字段是每天都变化的,所以没有对比意义
SCD问题
由于数据会缓慢发生变化,所以要 保留历史数据,这样 可以分析历史变化信息
把处理维度表 数据历史变化 的问题,称为缓慢变化维问题,简称SCD问题
解决方案
保留原始值(不推荐)
始终按照 原始值 进行处理。如:出生日期已经修改了,但始终按照用户第一次填写的数据为准
改写属性值(不推荐)
数据发生变化后,直接更新,用 新值,不保留 原值,因此其始终反映最近的情况。
修改后:
| 用户ID | 用户名 | 出生日期 | 住址 |
|---|---|---|---|
| 114 | 张三 | 1992-09-08 | 北京市朝阳区 |
缺点: 没有保留历史数据,无法分析历史变化信息
增加维度新列(不推荐)
在表中 增加一个字段,这个字段用来 保存变化后的当前值,而原来的值则被称为变化前的值
修改前:
| 用户ID | 用户名 | 出生日期 | 住址 |
|---|---|---|---|
| 114 | 张三 | 1988-09-08 | 北京市朝阳区 |
修改后:
| 用户ID | 用户名 | 出生日期 | 新出生日期 | 住址 |
|---|---|---|---|---|
| 114 | 张三 | 1988-09-08 | 1992-09-08 | 北京市朝阳区 |
添加历史表(不推荐)
新建历史表,来保存历史记录,这种方式就是将历史数据与当前数据完全分开来,在维度中只保存当前最新的数据。
优点:可以同时分析当前及前一次变化的属性值
缺点:只保留了最后一次变化信息并且后期查询时候可能需要关联多张表。
用户维度表:
| 用户ID | 用户名 | 出生日期 | 住址 |
|---|---|---|---|
| 114 | 张三 | 1988-09-08 | 北京市朝阳区 |
用户维度历史表:
| 用户ID | 用户名 | 出生日期 | 住址 |
|---|---|---|---|
| 114 | 张三 | 1988-09-08 | 北京市朝阳区 |
| 114 | 张三 | 1992-09-08 | 北京市朝阳区 |
拉链表(推荐)
保留历史的数据,并插入新的数据,也就是 拉链表
详见:
https://www.malaoshi.top/show_1IX39k0HHcoX.html
参考:
https://blog.csdn.net/qq_41369191/article/details/105953163