首页/数据/数仓建模速查/键映射表:自然键到代理键
维度与事实设计149 条

键映射表:自然键到代理键

维护 source / natural_key / sk / 生效区间 的映射表,隔离业务键变化与跨源合并;事实解析统一走映射,键重分配不动事实。

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

键映射表是什么

键映射表把来源系统的自然键翻译成维表代理键,并把翻译结果连同生效区间一起存下来。它是「业务键会变、代理键不能乱动」这对矛盾之间的缓冲层:源系统换号、合并、拆分时只改映射关系,事实表里已经落好的 sk 不动,避免为了几个键重刷历史。

基本信息

核心结构source_sys + natural_key → sk
区间列start_date / end_date
唯一键source_sys + natural_key + start_date
存放位置与主维同库,随维表加载同步更新
下游用法事实解析统一走映射,不直连维表

典型使用场景

  • 事实表落地时把自然键翻译成 sk,避免与维表加载互相等待
  • 同一客户在多个业务系统有编号,在映射表内完成跨源合并
  • 自然键因业务规则变更需要重分配时,只更新映射不改事实
  • 历史事实按「当时有效的键」回溯查询
  • 合并两个维表或拆分一个维表时保留旧键到新键的追溯链

建映射表与解析

建映射表与解析
CREATE TABLE dim_customer_keymap (
  source_sys  string COMMENT '来源系统标识',
  natural_key string COMMENT '源系统内的客户编号',
  customer_sk bigint COMMENT '统一后的代理键',
  start_date  date, end_date date
) STORED AS ORC;

-- 事实解析:按来源系统加自然键取当时生效的 sk
SELECT f.order_id, m.customer_sk
FROM ods_order f JOIN dim_customer_keymap m
  ON m.source_sys = 'CRM' AND m.natural_key = f.crm_cust_no
 AND f.dt >= m.start_date AND f.dt < m.end_date;

逐列读法

列含义异常表现
source_sys定义键的命名空间为空时不同系统编号直接撞键
natural_key源系统内的稳定编号复用旧编号会导致历史关联漂移
customer_sk合并后的统一代理键同一自然键对应多个 sk 说明重复分配
start_date该映射的生效起点区间重叠会让一条事实匹配到多行
跨源实体合并(同一客户在 CRM 与商城两套编号)在映射表内完成,主维只保留合并后的结果。映射表的巡检项是:同一 source_sys 下区间不重叠、同一自然键任一日期只命中一行,出现重叠或空洞要阻断当日加载。
映射表要保留的历史比主维更长:主维按类型 2 存的是属性版本,映射表还要记录已合并、已废弃的旧编号,否则拿半年前的自然键回查历史事实会一行都匹配不到。

易错点

  • 映射表缺生效区间:换键历史无法表达,回溯查询只能拿到当前值
  • 各链路绕过映射直连维表:键生成出现两套逻辑,同一客户两条记录
  • 区间重叠不校验:一条事实匹配到多行映射,聚合金额被放大
  • 映射表与主维不同批更新:维表已换键而映射还是旧的,新增事实挂到废弃 sk
  • 映射表被当临时表清理:清理任务删掉历史区间,回溯查询批量失败
  • 同一自然键在同一生效日有多条映射:事实关联后行数放大,需要加联合唯一约束兜底

数据来源与参考

  • 数仓建模实践:代理键映射管理
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌