数仓中的三类键
数仓里同时存在三类键,用途必须分清。业务键来自源系统的业务主键,如订单号、商品编码,用于跨系统识别同一实体。代理键是维表的主键,通常是自增或哈希生成的整数,用于事实表关联,保证同一实体多个版本各有唯一标识。技术键服务于加载与去重,比如批次号、行哈希,只在加工过程内部使用。把三类键混用是数据问题的常见根因:关联用错键,结果对不上且不易发现。
基本信息
| 业务键 | 源系统业务主键,如 order_no、product_code |
|---|---|
| 代理键 | 维表主键,如 user_sk,事实表通过它关联 |
| 技术键 | 加载批次号、行哈希,用于去重与排查 |
| 命名约定 | bk_ 前缀、xxx_sk 后缀、load_batch_id 之类 |
| 使用边界 | 代理键用于关联,业务键用于匹配,技术键不外露 |
典型使用场景
- 维表设计:代理键保证版本行唯一,事实表引用后历史归属可还原
- 跨系统匹配:用业务键对接上下游,避免依赖某一侧的自增编号
- 增量去重:用批次号或行哈希识别重复投递,实现幂等写入
- 问题排查:批次号可快速定位是哪一次加载引入了异常数据
- 血缘与对账:业务键是跨域对齐的公共语言,代理键只在库内使用
三类键的使用
三类键的使用
-- 维表:代理键为主键,业务键用于识别同一实体
-- dim_product(product_sk, product_code, product_name, start_date, end_date)
-- product_sk 代理键:版本唯一,事实表引用
-- product_code 业务键:源系统编码,跨系统匹配用
-- 事实表:存代理键用于关联,必要时冗余业务键便于排查
SELECT sum(f.amt)
FROM fact_sale f
JOIN dim_product d ON f.product_sk = d.product_sk -- 用代理键关联
WHERE d.product_code = 'SKU-10086' -- 用业务键筛选
AND d.is_current = 1;
-- 技术键:加载批次标识,仅用于去重与回溯
-- concat(load_date, '_', batch_id) AS load_batch_id三类键对照
| 类别 | 命名示例 | 用途与边界 |
|---|---|---|
| 业务键 | order_no、product_code | 跨系统识别实体,可对外 |
| 代理键 | user_sk、product_sk | 事实与维度关联,库内使用 |
| 技术键 | load_batch_id、row_hash | 加载去重与排查,不参与口径 |
| 混用风险 | 同一列身兼两职 | 关联结果错位且难察觉 |
键混用最典型的表现为金额或行数出现难以解释的偏差:事实与维度用了不同键关联,形成隐性断链,链路不报错但结果错误。
技术键不要泄露到业务口径里。把批次号当作业务维度使用,报表会随调度批次变化,使用者会看到毫无意义的波动。