枚举编码是什么
枚举编码的核心是码值与显示名分离:维表和事实表里只存短码值(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 | 是否启用 | 下线码值保留历史,不物理删除 |
码表变更只影响展示层,历史事实无需回刷;但仍建议记录码值的启用与停用时间,否则下线的码值在历史报表里会显示为空白或未知。
状态类码值的「顺序」本身就是业务含义(如 待付款 -> 已付款 -> 已发货),排序号要在码表里统一维护,不要让每个报表各写一套映射。