首页/数据/数仓建模速查/枚举编码:码值与显示名分离
维度与事实设计149 条

枚举编码:码值与显示名分离

枚举在维表中存码值并配对照表(或码表维),显示名与排序只在展示层处理;直接存中文名会让多语言与排序都变难。

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

枚举编码是什么

枚举编码的核心是码值与显示名分离:维表和事实表里只存短码值(A、B、C 或 1、2、3),显示名、颜色、排序号放在码表维(字典表)里,展示层再映射。直接把中文名写进业务表,会让改名、多语言、排序三件事同时变难:改一次文案就要回刷历史数据。

基本信息

存储内容短码值,如 A/B/C 或 1/2/3
对照方式码表维 dim_code,按 code_type + code_value 定位
展示处理视图或 BI 层映射为显示名
排序字段码表内维护 sort_no,不要依赖名称排序
多语言码表按 locale 扩展显示名
变更影响改名只影响展示层,历史事实无需回刷

典型使用场景

  • 订单状态展示:库里存 paid/shipped,报表映射为「已付款」「已发货」
  • 多语言产品:同一码值在中英站点显示不同文案
  • 受控字段校验:码表作为白名单,拦截非法状态值写入
  • 排序控制:状态按业务顺序排列,而非按拼音排序
  • 口径登记:码表同时充当字段取值说明,供使用方查询

码表关联与取值校验

码表关联与取值校验
SELECT o.status_code, d.status_name, d.sort_no, count(1) AS ord_cnt
FROM dwd_order o
LEFT JOIN dim_code d
  ON d.code_type = 'order_status' AND d.code_value = o.status_code   -- 双键定位,避免不同字段码值冲突
GROUP BY o.status_code, d.status_name, d.sort_no
ORDER BY d.sort_no;   -- 用码表排序号,保证展示顺序稳定
SELECT DISTINCT o.status_code
FROM dwd_order o
LEFT JOIN dim_code d ON d.code_type = 'order_status' AND d.code_value = o.status_code
WHERE d.code_value IS NULL;   -- 反查码表外的脏值,作为数据质量校验

码表字段建议

字段含义说明
code_type码表类型区分订单状态、支付方式等,避免码值撞车
code_value码值入库到事实表的值,保持稳定
code_name显示名可随文案调整,不影响事实表
sort_no排序号控制展示顺序,避免按名称排序
is_valid是否启用下线码值保留历史,不物理删除
码表变更只影响展示层,历史事实无需回刷;但仍建议记录码值的启用与停用时间,否则下线的码值在历史报表里会显示为空白或未知。
状态类码值的「顺序」本身就是业务含义(如 待付款 -> 已付款 -> 已发货),排序号要在码表里统一维护,不要让每个报表各写一套映射。

易错点

  • 中文显示名直接入业务表,一次文案调整引发全链路数据回刷
  • 码表没有版本或停用时间,历史报表文案随当前码表漂移
  • 不区分 code_type,不同字段的相同码值被映射到同一显示名
  • 码值随业务扩张随意追加,缺少白名单校验,脏值直接入库

数据来源与参考

  • 数仓建模实践:码值管理
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌