遗留系统数据迁移实战(九):区域编码迁移与补偿接口设计

为什么区域迁移复杂

区域看起来只是一个字段,实际影响很多业务:

  • 设备归属
  • 抄表册选表
  • 抄表任务范围
  • 数据权限
  • 统计报表
  • 页面树形展示

如果区域迁错,数据可能还能落库,但业务使用会出问题。

老系统和新系统的差异

遗留系统常见区域字段是长编码,例如:

text 复制代码
国家 + 城市 + 区域 + 小区 + 楼栋

新系统可能有自己的区域表:

text 复制代码
region_id
parent_id
region_code
level
tenant_id

两边不一定一一对应。

为什么需要补偿接口

一开始可以在主流程中直接转换区域,但后来发现不够灵活。

原因是:

  • 区域数据可能先迁,也可能后修
  • 某些非核心区域在新系统里没有映射
  • WalkBy 册子区域关系和设备区域关系不完全一样
  • 历史数据可能存在脏区域

所以最终采用:

text 复制代码
主迁移流程先落库
区域补偿接口后修正

这样主流程更稳,区域问题可以单独处理和验证。

补偿接口做什么

区域补偿主要处理几类数据:

text 复制代码
dev_device_instance.region_code
rm_record.region_code
rm_record_hi.region_code
rm_rela_book_region
province_id / city_id / region_id

核心目标是:

text 复制代码
把老系统区域编码转换成新系统区域编码
并修复依赖区域的业务关系

非核心区域无法映射怎么办

迁移中经常遇到源库区域无法映射到目标区域。

这不一定是失败。

需要区分:

  • 核心业务区域无法映射
  • 非核心历史区域无法映射

如果是非核心历史区域,可能只影响历史册子记录,不影响当前设备和业务使用,可以作为 non_core_unmapped_region_codes 返回。

这样接口返回更清楚:

text 复制代码
core_unmapped_region_codes = []
non_core_unmapped_region_codes = [...]
business_region_ready = true

这比简单返回"有 unmapped"更容易验收。

为什么不强行创建区域

自动创建区域看起来方便,但风险很高。

区域是权限和业务范围的基础数据。如果自动创建错层级、错租户、错父级,会导致更严重的问题。

更稳妥的做法是:

text 复制代码
核心区域必须提前准备好
迁移只做映射和补偿
找不到的区域显式返回
由人工确认是否需要补区域

省市区层级字段怎么补

有些业务表不仅有 region_code,还有:

text 复制代码
province_id
city_id
region_id

补偿时可以通过当前区域向上递归父级:

text 复制代码
当前区域 -> parent_id -> parent_id -> ...

找到 level 为 1、2、3 的节点后,分别回写到对应字段。

如果某一级找不到,不应该清空原字段,而是保留原值。

为什么保留原值

区域补偿应该尽量是低风险操作。

如果某一级找不到就清空,可能把原本正确的数据破坏掉。保留原值意味着:

text 复制代码
能补的补
不能补的不破坏

这更适合生产迁移。

总结

区域补偿接口的核心设计原则是:

text 复制代码
主流程不被区域细节阻塞
核心区域必须正确
非核心区域显式返回
能补则补,不能补不破坏

区域迁移不是简单字段映射,而是组织、权限、设备和业务记录之间的一次关系重建。

相关推荐
超兔一体云2 小时前
MySQL索引优化实战——从慢查询到索引调优
后端·mysql
2601_962074813 小时前
大数据-264 实时数仓 - Canal MySQL的binlog研究 存储目录 变动信息 配置MySQL
大数据·数据库·mysql
2601_962073813 小时前
大数据-240 离线数仓 - 广告业务 测试 ADS层数据加载 DataX数据导出到 MySQL
大数据·数据库·mysql
这个DBA有点耶6 小时前
SQL:2023新特性详解:JSON_TABLE、GREATEST/LEAST、QUALIFY 到底怎么用?
数据库·sql·mysql
小王C语言6 小时前
MySQL 用户管理:创建用户、给用户授权
数据库·mysql
小镇敲码人7 小时前
【深入浅出】之Qt 事件系统实战:鼠标、键盘、滚轮、窗口与定时器事件
数据库·qt·网络协议·mysql·http
Sirens.7 小时前
MySQL数据库:索引
数据库·mysql
2601_962072507 小时前
大数据-234 离线数仓 - 异构数据源 DataX 将数据 从 HDFS 到 MySQL
大数据·mysql·hdfs
2601_962073978 小时前
【MySQL】全面学习数据库查询技巧:查询指令深度学习指南
数据库·学习·mysql
2401_834636999 小时前
从零开始学 MySQL:SQL 编程、多表查询、用户管理一站式教程
mysql