1 概述: 数据建模之缓慢变化维场景(SCD)
- 缓慢变化维,是大数据或数据仓库中,维度表(如用户、商品表)的属性随时间缓慢变更(非实时高频),却需保留历史状态以支持多时间点数据分析的问题,核心是平衡“数据时效性”与“历史可追溯性”。
比如,用户表中,用户“所在城市”从“北京”变更为“上海”,若直接覆盖旧数据,将无法统计该用户变更前在北京产生的订单数据;若不处理,当前数据又会失真,这就是典型的缓慢变化维问题。
2 常见缓慢变化维(SCD)处理方案及适用场景
以下是4种核心处理方案,均以“用户ID=10001的用户,所在城市从北京变更为上海”为例说明:
方案1:覆盖式更新
- 处理逻辑:直接用新属性值覆盖旧值,不保留历史记录。
- 示例:用户表中,将用户10001的“所在城市”字段直接从“北京”改为“上海”,原“北京”记录被删除。
- 适用场景:无需追溯历史、仅需保留最新状态的场景,如用户“昵称”“头像”等非核心属性的变更,或数据录入错误后的修正。
方案2:新增行式更新
- 处理逻辑:不修改旧数据,新增一行包含新属性值的记录,通过“生效时间”“失效时间”“是否当前记录”等字段区分状态。
- 示例:保留原“用户10001-北京”的记录,新增“用户10001-上海”的记录;原记录失效时间设为变更日期,新记录生效时间设为变更日期、“是否当前”设为“是”。
- 适用场景:需完整追溯历史状态的核心场景,如用户“所在城市”“会员等级”等影响业务统计(如区域订单量、会员消费分析)的属性变更。
方案3:新增列式更新
- 处理逻辑:在原表中新增“旧属性列”(如“原所在城市”),保存旧值,原字段更新为新值,仅保留最近一次历史记录。
- 示例:用户表新增“原所在城市”列,将旧值“北京”存入该列,原“所在城市”列更新为“上海”,仅记录“上海→北京”这一次变更。
- 适用场景:仅需对比“当前值”与“最近一次旧值”,无需完整历史轨迹的场景,如商品“原价”与“现价”的对比展示,或用户“上次所在城市”与“当前城市”的简单分析。
方案4:组合式更新,Type1+2+3
- 处理逻辑:结合Type1(覆盖)、Type2(新增行)、Type3(新增列)的特点,既新增行保留完整历史,又在当前行新增列记录关键历史信息。
- 示例:新增“用户10001-上海”的行(Type2),同时在当前行新增“上次所在城市”列记录“北京”(Type3),原记录标记失效(Type2)。
- 适用场景:需兼顾完整历史追溯与便捷查询关键历史信息的场景,如金融领域客户“职业”“收入等级”变更,既需追溯每一次变更以满足合规审计(Type2),又需快速获取“当前职业”与“上一职业”进行对比分析(Type3)。