如何合并增量数据集与快照数据集并保留已删除行?
数据集删除行保留最优实现方案
1. 新增统一元数据字段
给Dataset Y、Dataset Z统一新增3个核心元数据字段,所有字段值随行变更同步更新:
op_type:操作类型枚举,标记行对应操作是插入I、更新U、删除Drow_version:行版本时间戳,精确到毫秒即可,取值为对应操作在源表发生的时间is_deleted:布尔型软删除标记,删除行设为true,正常有效行设为false
2. 调整Dataset Y的生成与快照逻辑
- 同步源表操作时,除了新增、更新行之外,单独捕获源表的删除事件,为每个删除行生成一条
op_type=D、is_deleted=true的增量记录,保留该行所有原有业务字段,row_version取删除操作发生时间 - Dataset Y的快照按
row_version分区存储,所有历史变更记录(含删除记录)永久留存,滚动快照时不清理历史版本,从根源避免删除行丢失
3. 重构Dataset Z的合并逻辑
原合并逻辑仅取X或Y的最新版本,调整后规则如下:
- 预处理Dataset X:为X中所有行补充元数据字段,
is_deleted默认设为false,row_version取X的快照生成时间 - 预处理Dataset Y:按主键对Y的所有记录分组,取每组中
row_version最大的记录,得到每个主键的最新增量状态集合 - 按主键关联两个预处理后的数据集执行合并:
- 主键同时出现在X和Y最新集合:优先取Y的记录,不管是更新状态还是删除状态
- 主键仅出现在Y最新集合且
is_deleted=true:直接保留该删除记录到Z - 主键仅出现在X:直接保留X的对应记录
可选优化:兼容X的软删除逻辑
如果可以调整Dataset X的生成规则,可进一步简化合并逻辑:
每次生成X快照时,和上一版本X做全量主键对比,上一版本存在、当前源表不存在的行,在本次X快照中标记is_deleted=true,保留所有原有字段。调整后Z的合并逻辑可简化为直接取同主键下row_version更大的记录即可,无需单独处理X缺失的删除行。
内容的提问来源于stack exchange,提问作者tomwhittaker
相关产品推荐
相关产品推荐

