首页/数据/数仓建模速查/码表与字典维度 Lookup Dimension
建模基础69 条

码表与字典维度 Lookup Dimension

编码类字段(状态码、渠道码)统一下沉为码表维度,事实表存编码,展示时 join 翻译;避免编码含义散落在 SQL 常量里。

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

码表维度是什么

状态码、渠道码、支付方式码这类编码字段,适合统一下沉为一张码表维度:事实表只存编码,展示时 join 翻译成名称。好处是编码含义不再散落在各处 SQL 的 case when 里,新增一个码值只需在码表里加一行。码表维度通常很小,可以包含编码、名称、上级编码与层级这类列。它同时也是口径的一部分:状态口径变化时要同步更新码表与文档,而不是只在某一层 SQL 里改条件。

基本信息

典型结构code + name + 上级编码 + 层级 + 生效状态
使用方式事实表存编码,展示时 join 码表翻译
治理方式码值增删改走字典管理,变更留痕
维护频率随源系统编码表同步,通常每日刷新

典型使用场景

  • 订单状态梳理:状态码统一在码表维护,报表展示与分组口径一致
  • 渠道编码对齐:多来源渠道码在码表统一映射,避免各报表口径不同
  • 支付方式统计:新增支付方式只需加码值,无需改所有报表 SQL
  • 编码层级分析:码表带上级编码后,可按大类汇总小类
  • 口径变更管理:状态口径调整时改码表并留痕,变更可被追溯

码表结构与翻译

码表结构与翻译
-- dim_status(status_code, status_name, parent_code, level, is_valid)
SELECT s.status_name,               -- 翻译后的状态名称
       count(1) AS order_cnt
FROM fact_order f
JOIN dim_status s ON f.status = s.status_code  -- 按编码关联翻译
WHERE s.is_valid = 1                -- 只取有效码值
GROUP BY 1
ORDER BY 2 DESC;

-- 反例:编码含义写在 SQL 常量里,含义变更要全量排查
-- CASE WHEN status = '3' THEN '已支付' WHEN status = '4' THEN '已发货' END

码表与事实的边界

内容放置位置原因
状态编码列表码表维度供多表复用,变更单点生效
状态发生时间事实表随每笔业务变化,属于事实
编码层级关系码表维度便于按大类汇总
统计口径条件码表或指标定义口径集中登记,避免散落
码表与源系统不同步是翻译出现空值的最常见原因:新码值已在事实里出现,码表还没刷新,报表里就多出一批空状态。
失效码值建议保留并标记,而不是直接删除:历史事实仍引用这些编码,删掉后历史报表会立刻出现空维度。

易错点

  • 编码硬编码在 SQL 里:含义或范围变更时要全量排查,遗漏一处即口径分叉
  • 码表与源系统不同步:翻译出现空值,且表现为报表里莫名多出一类
  • 失效码值直接删除:历史事实关联不到码表,历史报表分组为空
  • 同一编码在不同表里含义不同:跨表 join 命中错误名称,结论被误导

数据来源与参考

  • 维度建模实践:码表维度
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌