结论先给:如果旧字段仍能承载历史数据、新需求只是增加维度或补充属性,优先做“加字段+回填”的兼容式扩展;如果旧结构把多个业务含义压进同一个字段、查询和统计已经互相污染,才值得停机做结构重做。判断依据不是字段数量,而是旧字段是否还能被稳定解释。
上线后常见的“字段不够用”有两类。第一类是新增了一个本来不存在的属性,例如原来只记录咨询提交时间,现在还要区分首次提交和再次提交;这类问题加一个可空字段、补默认值、再回填历史数据通常就够。第二类是同一个字段承担了太多含义,例如一个状态字段既表示订单阶段又表示支付结果,查询时只能靠约定去猜;这时继续加字段只会让判断逻辑更碎。
可以用一个简单测试区分:把现有字段的每个取值写成一句话,看是否只有一个业务含义。若同一列里既有“已联系”又有“已成交”,说明它已经混合了过程与结果,属于结构问题,不是单纯缺列。
兼容式扩展成立的前提是:旧字段仍可保留,新字段允许为空,历史记录可以按明确规则回填,且现有查询不依赖新字段才能返回正确结果。满足这些条件时,动作顺序可以是:
这个动作的直接结果是:线上写入不中断,历史数据逐步补齐,下一步可以安全地增加筛选和报表维度。代价是短期内存在双字段并存,需要在代码和文档里标明优先级。
反例:如果旧字段已经被外部系统当作唯一标识使用,例如合作方按该字段对账,而你新增字段后改变了它的取值规则,那么“加字段”并不能解决问题,反而会让对账结果分叉。此时应先把旧字段冻结为对外接口,新增内部字段承载新含义,等外部依赖迁移完成后再考虑合并。若无法冻结,就要安排一次受控的结构调整,并提前确定回滚方式。
另一个会使结论失效的条件是:数据量已经大到回填会明显影响线上查询。这时应把回填拆成小批次,并避开业务高峰,而不是一次性全量更新。
假设一个内容站原来只记录文章发布状态,后来要区分“已发布但待更新”和“已下线待重写”。若直接改原状态字段的取值,旧筛选条件会把待更新文章误判为已发布;若新增一个“维护状态”字段并允许为空,旧逻辑不变,新逻辑只处理有值的记录,风险就小得多。这个例子只用于说明判断方法,不代表任何具体系统的现状。
拿一张纸或一份表格,列出当前所有字段、每个字段的实际取值、谁在写入、谁在读取。把“一个字段对应多个业务含义”和“多个字段表达同一含义”分别标出来。标完后你会得到两个清单:可以安全新增的字段,以及必须先冻结或迁移的字段。先处理第二类,再处理第一类,扩展才不会把旧问题放大。