退化维度是什么
退化维度是直接存放在事实表里、本身没有独立维度表的业务标识符,典型是订单号、支付流水号、发票号、合同号。它满足维度的部分功能(用于筛选与分组),但除了这个编号几乎没有可描述属性,单独建一张只有 id 的维度表只会增加连接成本与维护负担,因此在 Kimball 维度建模中直接留在事实表中。判断标准是:基数高、没有可枚举取值集合、不需要与其他属性组合分析。
基本信息
| 建模体系 | Kimball 维度建模(星型模型) |
|---|---|
| 形态 | 事实表中的业务单号字段,无代理键 |
| 基数 | 接近唯一,一单一号 |
| 常见字段 | 订单号、流水号、发票号、批次号 |
| 主要作用 | 明细追溯、去重计数、与源系统对账 |
典型使用场景
- 交易事实表保留 order_id,客服可按单号定位具体一笔交易
- 统计订单量用 COUNT(DISTINCT order_id),避免一单多明细被重复计数
- 与源系统核对:按单号抽样比对金额、状态、时间是否一致
- 对账差异排查:拿到差异单号后直接回到事实表核对明细行
- 多来源合并时用单号做业务唯一键,识别重复入库的记录
退化维度用法
退化维度用法
-- 订单号留在事实表,不建 dim_order 表
CREATE TABLE fact_trade_order (
order_id BIGINT COMMENT '退化维度:订单号',
user_sk BIGINT, -- 用户维度代理键
product_sk BIGINT, -- 商品维度代理键
pay_amount DECIMAL(18,2),
pay_time TIMESTAMP
) PARTITIONED BY (dt STRING);
-- 按单号追溯明细
SELECT * FROM fact_trade_order WHERE order_id = 20261011001;
-- 订单量:按退化维度去重
SELECT dt, COUNT(DISTINCT order_id) AS order_cnt FROM fact_trade_order GROUP BY dt;常见退化维度对照
| 字段 | 出现位置 | 典型用途 | 注意点 |
|---|---|---|---|
| 订单号 | 交易事实表 | 订单量统计、明细追溯 | 与源系统编码位数保持一致 |
| 支付流水号 | 支付事实表 | 与支付渠道对账 | 渠道可能重传,写入需幂等 |
| 发票号 | 开票事实表 | 税务核对、票据追溯 | 红冲与正开是两条记录 |
| 批次号 | 加载相关表 | 定位某次加载的重复数据 | 偏技术字段,业务分析少用 |
退化维度常与去重统计配合:COUNT(DISTINCT order_id) 统计订单数,数据天然来自事实表,不需要额外维度表参与连接。
在拉链表与增量表中保留退化维度,下游才能按业务单号反查某笔业务的历史变化;若单号只存在于 ODS 层,数仓内部就定位不到具体业务事件。
退化维度被改名、截断或补零格式化后,与源系统的对账会大量匹配失败;字段类型(整型或字符串)也要与上游统一,否则前导零会丢失。