首页/数据/数仓建模速查/数仓中的三类键
建模基础69 条

数仓中的三类键

区分业务键(源系统主键)、代理键(维表主键)、技术键(加载批次/哈希);三类键在模型文档中分别声明用途。

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

数仓中的三类键

数仓里同时存在三类键,用途必须分清。业务键来自源系统的业务主键,如订单号、商品编码,用于跨系统识别同一实体。代理键是维表的主键,通常是自增或哈希生成的整数,用于事实表关联,保证同一实体多个版本各有唯一标识。技术键服务于加载与去重,比如批次号、行哈希,只在加工过程内部使用。把三类键混用是数据问题的常见根因:关联用错键,结果对不上且不易发现。

基本信息

业务键源系统业务主键,如 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加载去重与排查,不参与口径
混用风险同一列身兼两职关联结果错位且难察觉
键混用最典型的表现为金额或行数出现难以解释的偏差:事实与维度用了不同键关联,形成隐性断链,链路不报错但结果错误。
技术键不要泄露到业务口径里。把批次号当作业务维度使用,报表会随调度批次变化,使用者会看到毫无意义的波动。

易错点

  • 事实与维度用不同键关联:隐性断链,结果偏差且不报错
  • 技术键泄露到业务口径中:报表数字随调度批次变化,无法解释
  • 代理键用可变的业务键代替(如用商品编码当版本主键):版本行冲突
  • 三类键无命名区分:使用者误把技术键当业务键筛选,结果为空

数据来源与参考

  • 数据仓库设计实践
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌