首页/数据/数仓建模速查/杂项维度 Junk Dimension
建模基础69 条

杂项维度 Junk Dimension

把多个低基数的标志位(是否首单、是否含赠品等)合并成一张杂项维度,避免事实表字段膨胀与维度表碎片化。

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

杂项维度是什么

杂项维度把多个低基数的标志位合并成一张小维表:是否首单、是否含赠品、是否加急、是否使用优惠券各自取值只有两三个,单独建维表会碎片化,直接放事实表又会让列数持续膨胀。做法是把这些标志的组合枚举成一个组合键,事实表只存一个代理键,分析时 join 回杂项维度还原各标志。它与迷你维度的区别在于:杂项维度放的是枚举标志,迷你维度放的是会随成员变化的离散属性。

基本信息

数据来源多个布尔或低基数枚举标志
结构标志组合枚举表,一组合一行
收益减少事实表列数,避免维表碎片化
维护新增标志需重建组合,行数按乘积增长

典型使用场景

  • 订单标志组合:首单、含赠品、加急、线上支付,四个标志各自建维表过于零碎
  • 风控标记归集:是否命中规则、是否人工复核等标志集中在同一张表便于切片
  • 维度表数量治理:把十来个两值标志收敛为一张维度,总线矩阵更清晰
  • 事实表瘦身:列存引擎下减少列数直接降低扫描与维护成本
  • 指标下钻:按标志组合分析订单金额分布,无需为每个标志单独写条件

组合维与查询

组合维与查询
-- 杂项维度:三个标志的组合枚举,最多 8 行
-- dim_order_flag(flag_key, is_first, has_gift, is_urgent)
SELECT d.is_first,       -- 是否首单
       d.has_gift,       -- 是否含赠品
       sum(f.amount) AS amt
FROM fact_order f
JOIN dim_order_flag d ON f.flag_key = d.flag_key
GROUP BY 1, 2;            -- 按标志组合切片,无需拆多张维表

适用与不适用

情形结论原因
标志数 3-5 个、基数低适合入杂项维度组合数可控,收敛效果明显
标志数超过 8 个先评估组合爆炸组合数按乘积增长,维护成本陡升
标志会持续新增评估拆回事实表每次新增都要重建组合与回刷事实
单个标志基数很高不适合组合数失控,失去收敛意义
组合数估算很简单:把各标志的取值个数相乘。三个二值标志只有 8 行,六个二值标志就是 64 行,看起来仍然很小,但每新增一个标志都要全量回刷事实表的组合键,工程成本才是真正的约束。
杂项维度里的标志要保证互斥且覆盖完全,出现未匹配组合时应有默认键兜底,否则加载阶段会出现意外空值。

易错点

  • 标志不断增加:组合表按乘积膨胀,最终比若干独立小维表更难维护
  • 高基数标志塞进杂项维度:组合数失控,反而成为新的性能瓶颈
  • 新增标志后未回刷事实表组合键:大量事实落默认键,切片分析失真
  • 把互相依赖的标志拆成独立列:同一事实出现自相矛盾的组合

数据来源与参考

  • Kimball 方法论:杂项维度
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌