首页/数据/数仓建模速查/SCD 类型 1:直接覆盖
维度与事实设计149 条

SCD 类型 1:直接覆盖

只保留最新值,变更时原地覆盖旧值;适合纠错型属性(名称写错、编码补全),不承担历史分析需求。

数仓建模速查数据更新于 2026-10-13

类型 1 是什么

类型 1 只保留最新值,变更时原地覆盖旧值:名称写错后改正、编码补全、缺失值补齐,都属于这类纠错型变更。它不承担历史分析需求,覆盖后历史报表的呈现会随之改变——这不是缺陷,而是它与类型 2 的根本区别。选型时先问一句「这个属性变化时,历史分析是否需要按变化前的值来解释」,需要就必须用类型 2 或类型 3。

基本信息

历史不保留,只有最新值
写法update 或 merge 原地覆盖
适用纠错、补全、编码规整类属性
副作用历史报表的维度呈现随最新值变化
实现注意大表原地更新会触发锁与存储膨胀

典型使用场景

  • 名称纠错:客户名称录入有误,改正后所有报表都应显示正确名称
  • 编码补全:来源缺失的行政区编码用权威编码补齐
  • 大小写与空格规整:统一后同一实体的写法归一
  • 口径统一:旧口径的枚举值重映射到新口径
  • 联系人信息更新:电话、邮箱变更只关心最新值
  • 误分类修正:之前归类错误,修正后不需要保留错误版本

覆盖写法

覆盖写法
-- 只更新当前行,历史版本行不动
UPDATE dim_user d
JOIN   stg_user s ON s.id = d.user_id
SET    d.user_name = s.user_name
WHERE  d.is_current = 1;

-- 用 MERGE 写法(同一语义,注意条件里必须带 is_current)
MERGE INTO dim_user d
USING stg_user s ON d.user_id = s.id AND d.is_current = 1
WHEN MATCHED THEN UPDATE SET d.user_name = s.user_name;

选型对照

属性变化含义推荐类型原因
记录写错了要改正类型 1历史本身就是错的,保留没有意义
业务事实确实变了类型 2 或 3历史分析要按变化前的值解释
只想看最近一次变化类型 3一跳历史足够,表宽固定
字段经常变化但无分析价值类型 1避免版本行堆积造成膨胀
属性影响历史归因(等级、区域)类型 2按当时口径统计必须保留版本
类型 1 的更新会改写历史报表的呈现:如果某个维度属性被用于历史分组,一旦覆盖,上月的分组结果与本次报表可能不一致,已对外披露的数字会变。因此对已被报表引用的属性改用类型 1 之前,必须与使用方确认口径影响。

易错点

  • 把需要审计的属性用类型 1:历史变化无法追溯,问「什么时候改的」答不出来
  • 大表原地更新未评估成本:锁等待与存储膨胀拖垮同一实例的其他作业
  • 覆盖时漏写 is_current 条件:把历史版本行一起改写,拉链结构被破坏
  • 改口径用类型 1 却不通知下游:已披露的历史报表数字变化,业务方认为数据不可信
  • 用类型 1 处理本该类型 2 的属性:当下省事,后续按当时口径出数时无法补历史

数据来源与参考

  • 维度建模工具箱:缓慢变化维
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌