目录
-
介绍
缓慢变化维,简称SCD(Slowly Changing Dimensions)
一些维度表的数据不是静态的,而是会随着时间而缓慢地变化(这里的缓慢是相对事实表而言,事实表数据变化的速度比维度表快)
这种随着时间发生变化的维度称之为缓慢变化维
把处理维度表数据历史变化的问题,称为缓慢变化维问题,简称SCD问题
-
举例说明
用根据用户维度,统计不同出生年份的消费金额占比。(80后、90后、00后)。
而期间,用户可能去修改用户数据,例如:将出生日期改成了 1992年。此时,用户维度表就发生了变化。当然这个变化相对事实表的变换要慢。但这个用户维度表的变化,就是缓慢变化维。
| 用户ID |
用户名 |
出生日期 |
住址 |
| 114 |
张三 |
1988-09-08 |
北京市朝阳区 |
这个用户的数据不是一直不变,而是有可能发生变化。例如:用户修改了出生日期、或者用户修改了住址。
-
SCD问题的几种解决方案
保留原始值(不推荐)
某一个属性值绝不会变化。事实表始终按照该原始值进行分组。例如:出生日期的数据,始终按照用户第一次填写的数据为准
改写属性值(不推荐)
对其相应需要重写维度行中的旧值,以当前值替换。因此其始终反映最近的情况。
当一个维度值的数据源发生变化,并且不需要在维度表中保留变化历史时,通常用新数据来覆盖旧数据。这样的处理使属性所反映的中是最新的赋值。
修改前:
| 用户ID |
用户名 |
出生日期 |
住址 |
| 114 |
张三 |
1988-09-08 |
北京市朝阳区 |
修改后:
| 用户ID |
用户名 |
出生日期 |
住址 |
| 114 |
张三 |
1992-09-08 |
北京市海淀区 |
这种方法有个前提,用户不关心这个数据的变化
这样处理,易于实现,但是没有保留历史数据,无法分析历史变化信息
增加维度新行(推荐)
数据仓库系统的目标之一是正确地表示历史记录。典型代表就是拉链表。保留历史的数据,并插入新的数据。
修改前:
| 用户ID |
用户名 |
出生日期 |
住址 |
|
| 9527 |
114 |
张三 |
1988-09-08 |
北京市朝阳区 |
修改后:
| 编号 |
用户ID |
用户名 |
出生日期 |
住址 |
| 9527 |
114 |
张三 |
1988-09-08 |
北京市朝阳区 |
| 9528 |
114 |
张三 |
1992-09-08 |
北京市海淀区 |
增加维度新列(不推荐)
用不同的字段来保存不同的值,就是在表中增加一个字段,这个字段用来保存变化后的当前值,而原来的值则被称为变化前的值。总的来说,这种方法通过添加字段来保存变化后的痕迹。
修改前:
| 编号 |
用户ID |
用户名 |
出生日期 |
住址 |
| 9527 |
114 |
张三 |
1988-09-08 |
北京市朝阳区 |
修改后:
| 编号 |
用户ID |
用户名 |
出生日期 |
住址 |
现住址 |
|
| 9527 |
114 |
张三 |
1988-09-08 |
1992-09-08 |
北京市朝阳区 |
北京市海淀区 |

本文深入探讨了数据仓库中缓慢变化维(SCD)问题的多种解决策略,重点介绍了使用拉链表来有效存储和查询历史快照的方法。通过实例说明如何处理用户维度表中的数据变化,对比了保留原始值、改写属性值、增加维度新行等方案,最终推荐采用拉链表以保留完整的历史记录。
最低0.47元/天 解锁文章
675

被折叠的 条评论
为什么被折叠?



