码表维度是什么
状态码、渠道码、支付方式码这类编码字段,适合统一下沉为一张码表维度:事实表只存编码,展示时 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码表与事实的边界
| 内容 | 放置位置 | 原因 |
|---|---|---|
| 状态编码列表 | 码表维度 | 供多表复用,变更单点生效 |
| 状态发生时间 | 事实表 | 随每笔业务变化,属于事实 |
| 编码层级关系 | 码表维度 | 便于按大类汇总 |
| 统计口径条件 | 码表或指标定义 | 口径集中登记,避免散落 |
码表与源系统不同步是翻译出现空值的最常见原因:新码值已在事实里出现,码表还没刷新,报表里就多出一批空状态。
失效码值建议保留并标记,而不是直接删除:历史事实仍引用这些编码,删掉后历史报表会立刻出现空维度。