#16 数仓建模 中等

缓慢变化维(SCD)是什么?Type 1 / Type 2 怎么选?

SCD维度表历史拉链

🎯 考察意图

建模进阶。考察是否理解「属性变更要不要保留历史」。

📐 回答框架

  1. 定义 SCD:维度属性随时间变化。
  2. Type1 覆盖 vs Type2 留历史。
  3. 实现:生效/失效时间、当前旗标。
  4. 选型看分析是否需要「当时」状态。

💬 参考答案(口述版)

缓慢变化维:维度表中的描述属性会变(用户城市、商品类目、员工部门)。

  • Type 1:直接覆盖。简单,丢历史。适合纠错或不关心历史的属性。
  • Type 2:新增一行版本,用 start_date/end_date 或 is_current 保留历史。适合「要按历史属性归因」的分析(如当时所属渠道)。
  • Type 3:在同行保留少量「前值」列,用得较少。

选型:若报表需要「下单时用户的会员等级」而非「当前等级」,必须 Type 2(或事实表退化快照属性)。实现要注意区间半开闭约定与变更日对齐,避免双计或空洞。

🔍 关键词

Type1Type2生效区间历史归因

💭 面试官可能的追问

追问 1:拉链和快照表怎么选?

拉链省空间、查「任意一天状态」稍复杂;每日全量快照简单但存储大。高频近线查询可快照,长期存档可拉链。

⚠️ 常见踩坑

  • 该留历史却用 Type1,导致历史报表被「改写」
  • Type2 区间重叠造成关联翻倍

🧠 记忆锚点

要「当时状态」用 Type2;只关心当前用 Type1。