首页/数据/数仓建模速查/拉链合并的执行顺序与幂等
维度与事实设计149 条

拉链合并的执行顺序与幂等

典型流程:取源增量→算 hashdiff→与当前版本对比→关闭旧行→插入新行→质量校验,全程在单事务内保证读写一致。

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

拉链合并的执行顺序

拉链合并的典型流程固定为六步:取源增量、计算 hashdiff、与当前版本对比、关闭发生变更的旧行、插入新行、做质量校验。整个过程建议放在单事务里,保证读写一致,避免下游在中间态读到既无旧版本也无新版本的成员。合并逻辑必须幂等:同一批数据重跑两次,版本行数与内容都不应变化,这是判断实现是否可靠最直接的检验方式。

基本信息

执行顺序先关闭旧版本,再插入新版本,顺序不可颠倒
事务要求单事务执行,避免中间态被下游读到
幂等检验同批数据连跑两次,版本行数不变
前置去重源增量先按自然键去重,同批只保留最新一次变更
质量校验当前版本唯一、区间不重叠、无断档

典型使用场景

  • 每日维表增量:按批次合并变更,兼顾准实时与历史完整
  • 任务失败重跑:幂等设计让重跑不必人工清理中间结果
  • 多源变更合并:两个系统同时改同一成员时,按变更时间排序取最新
  • 历史修复:定位到错误版本后按区间回补,而不是整表重建
  • 上线演练:用同批数据连跑两次验证幂等,作为验收的必要步骤

合并流程要点

合并流程要点
1) 源数据先按自然键去重:同批多次变更只取变更时间最新的一条  # 防一次插多版本
2) 计算 hashdiff:属性集合固定,不含入库时间等易变字段  # 防无变更也插行
3) 与当前版本比对:hashdiff 相同则跳过,不同才进入关闭与插入  # 减少无意义版本
4) 关闭旧行:条件带 is_current = 1 并且 hashdiff <> 新值  # 防误关未变更成员
5) 插入新行:start_date 取变更生效时间,end_date 取远期极大值  # 区间连续
6) 质量校验:当前版本唯一、同键区间不重叠、不出现断档  # 校验不通过即告警

重跑与幂等

场景是否幂等处理方式
按批次号覆盖写入幂等重跑覆盖同批次结果,无需人工干预
先删本批再插入幂等删除条件必须精确到批次与自然键
直接追加插入不幂等重跑产生重复版本,需人工清理
全表重建幂等但代价高历史区间易断裂,需重新计算有效期
幂等检验的方法很简单:拿同一批数据连跑两次,比较版本行数与当前版本数量。数字不变说明实现可用;数字翻倍说明合并前缺少去重或关闭条件。
用 delete 加 insert 全表重建维表看似简单,但历史区间会被重新计算,已发出的报表口径随之变化,跨期对比立刻失真。

易错点

  • 直接 delete 加 insert 全表重建:历史区间断裂,跨期对比失效
  • 同批增量未去重:同一自然键一次插入多个版本,当前版本不再唯一
  • 关闭条件缺少 hashdiff 判断:属性没变也关旧插新,维表每日膨胀
  • 合并不在事务内执行:下游读到成员缺失的中间态,事实关联落默认键

数据来源与参考

  • 拉链表实现实践
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌