结论先行:如果旧字段仍在被正常写入、只是缺少新维度,优先做“加字段、不改旧字段语义”的向后兼容扩展;如果旧字段本身的含义已经无法覆盖新业务,就必须做一次带迁移映射的字段重构,而不是继续叠加。判断分界线不是数据量大小,而是旧字段是否还能被新老流程同时正确解释。
两种情况的处理成本差一个量级,判断依据可以直接从现有数据里找。
一个可用的验证动作:把最近一批新业务数据按旧字段的取值规则重新解释一遍,如果出现两种业务含义映射到同一个值,就属于语义失效,应走重构路径。
确认是缺字段后,扩展顺序建议是:先加存储、再补写入、最后才改读取和展示。这样每一步都能单独回退。
这一步的实际影响在于:双写期间数据会出现新旧不一致的可能,所以需要先明确以哪个字段为准,否则后续对账会变成新的问题。假设某订单表新增“结算方式”字段,双写一个月后核对发现旧字段缺失率约百分之几,这个比例本身不能证明扩展成功,它也可能来自旧客户端未升级,需要结合写入来源日志再判断。
语义失效的情况下,直接改字段类型或复用旧列名风险最高,因为旧代码可能仍在按老含义读取。更稳妥的顺序是:
关键取舍是迁移期间要不要保留旧结构:保留会增加一段时间的双份存储和维护成本,但能让回退变得简单;不保留则切换更快,一旦映射规则出错,历史数据很难还原。
如果旧字段不仅被本站读写,还被外部系统、离线报表或第三方接口当作固定契约使用,那么“加字段不改旧字段”也可能不够。此时新增字段不会破坏对方,但对方可能永远不读新字段,导致新业务数据在对方侧不可见。这种情况下需要先确认外部依赖方能否配合升级,再决定是扩展还是另建一份对外输出结构,而不是默认内部改完就结束。
先列出所有读写该字段的位置,包括页面表单、接口、定时任务和导出,再按“只写不读、只读不写、又读又写”分类。分类结果会直接决定你是走加字段路线还是重构路线:又读又写的位置越多,越应该选择新旧并存而不是直接改旧列。完成分类后,先在一个非核心业务流程上试跑扩展,确认写入和读取都符合预期,再推广到其余流程。