结论先给:如果旧字段只是数量不够、语义没变,优先做兼容式扩展;如果业务含义已经变了,比如原来一个“备注”现在要拆成客户等级、跟进阶段、来源渠道,那就别硬塞进旧字段,应该新建结构化字段并保留旧字段只读。判断标准不是字段多少,而是旧数据还能不能按原含义解释。
上线后最常见的误判,是把语义变化当成字段不足。比如表单里原本只有一个 remark 文本域,运营后来想按“意向等级”筛选,于是把“高意向”“已报价”写进备注。此时再加十个文本字段也没用,因为筛选依赖的是可枚举值,不是自由文本。
可操作的分界是:新需求能否用旧字段的现有值直接映射出来。能映射,属于扩展;不能映射,属于重构。前者风险低,后者要先冻结写入、再迁移。
假设一个黄石本地服务站的询价表,原来只有姓名、电话、需求描述。上线三个月后要记录“预算区间”和“期望联系时段”。这类新增不影响旧记录解释,做法是:
这样做的结果是:历史数据仍可读,新数据可筛选。下一步动作是检查导出和接口是否引用了旧字段名,若有,先加映射再改前端,避免后台能看、前台报错。
当旧字段含义已经不可逆地变化时,直接改名或改类型会让历史记录失去解释。更稳的顺序是:
这里的关键证据不是“迁移脚本跑完了”,而是随机抽取若干条历史记录,确认按新规则解释后与当时业务事实一致。若不一致,说明映射规则需要修正,而不是继续往下切。
如果旧字段虽然语义变了,但业务上已经不再需要保留历史解释,比如旧记录只是测试数据、从未对外使用,那么兼容式扩展和双写迁移都是多余成本。此时直接重建字段结构更快。判断依据是:这些历史记录是否还会被查询、对账或用于客服追溯。只要会,就不能直接覆盖。
字段加完不等于可用。至少检查:新字段在新增、编辑、导入三条路径上是否都能正确写入;筛选和导出是否按新字段生效;旧接口是否因字段缺失而返回空值并被前端当成“无数据”。第三步最容易被忽略,因为它不报错,只是结果看起来变少。发现这种情况时,下一步不是改数据库,而是回到接口层补默认值或调整前端判断。
字段扩展的决策点始终是旧数据还能不能按原义解释。能,就新增;不能,就先迁移再切换。把这个判断做完,再动手改表结构,返工概率会低很多。