先给结论:不要在原表上硬塞新字段,也不要直接删旧字段重来。正确顺序是——先冻结写入、评估旧数据能否映射到新结构、用新增附属表或文档字段扩展、最后分批迁移并保留回退路径。下面用一个假设情境把决策过程走完。
假设你在新疆做干果批发,网站上线时订单表只有“收货地址、联系人、电话、商品明细”。上线三个月后业务变了:一部分客户要自提,一部分要冷链发运,还有一部分走普通快递。运营想在后台按交付方式筛选订单,但数据库里根本没有这个字段。
这时会出现三种典型反应,而它们对应的条件完全不同:
字段不够用通常有两种原因。一种是属性维度增加,比如订单多了“交付方式”;另一种是一对多关系被压进了一个字段,比如把多个联系人写在同一格文本里。前者加字段就能缓解,后者必须拆表。
判断方法很直接:问自己“这个新信息,一个订单只会有一个值,还是可能有多个值”。只有一个值,加列;可能有多个值,建关联表。这个判断决定了后面所有动作,做错会反复返工。
三种做法各有适用条件,不存在默认最优。
假设你选了加列,下一步不是马上让运营用起来,而是先确认写入逻辑。旧的下单流程没有这个字段,新流程必须补上采集入口,否则新订单照样为空。
扩展字段最容易出问题的地方是回填。可回填的前提是有可靠依据。以上面的假设为例,如果旧订单备注里明确写了“自提”,可以按关键词回填;如果备注是自由文本、写法混乱,就不该强行回填,宁可留空并在后台标注“历史订单未记录”。
具体动作和结果:先在小范围订单上试跑回填脚本,检查匹配数量和误匹配情况。如果误匹配明显,就停止回填,改为只对新订单生效。这个结果会直接影响下一步——是继续做数据清洗,还是接受历史数据不完整、把精力放在新流程上。
同时保留回退路径:新增列先不删除任何旧字段,后台筛选先做成“新字段优先、旧字段兜底”。等新订单积累一段时间、确认采集稳定后,再考虑是否收紧旧逻辑。
如果出现下面这些信号,说明加字段已经不够,应该考虑重构数据结构,而不是继续打补丁:
重构的代价明显更高,需要停写、迁移、校验、切换,所以只有在上述信号同时出现、且业务确实依赖这些筛选时才值得做。否则,先用附属表或文档字段过渡,是更稳的选择。
把决策串起来就是:先分清唯一值还是多值,再选加列、附属表或文档字段,然后决定旧数据能不能回填,最后保留回退路径并观察新流程是否稳定。走完这四步,字段扩展才不会变成下一次上线事故。