结论先说:如果旧字段仍在被前端正常读取、历史数据也能对应上,优先做“加字段、加映射、保留旧表”的增量扩展,而不是重建数据库;但如果旧字段已经被写进合同、对账口径或第三方接口,且对方不接受新增字段,那么增量扩展会失效,只能先做数据迁移和接口重谈。判断依据不是系统新旧,而是旧字段是否仍在承担不可替代的对外约定。
上线后觉得字段不够用,常见有两种情况。一种是页面想多显示一个参数,比如产品列表要加材质、交期;另一种是业务对象本身缺了一层,比如原来一条记录只对应一个规格,现在要对应多个规格和多个价格区间。前者通常加列或加一张附表就能解决,后者如果继续在旧表上堆字段,会出现大量空值、重复行和难以维护的判断逻辑。
可操作的区分办法:把最近要上线的需求写成三列表格,分别是“字段名、属于哪个业务对象、是否一对多”。如果出现一对多,就不应该继续加在主表上。这个动作的结果会直接决定下一步:全是单值字段,就走增量加列;出现一对多,就先设计关联表,再决定旧数据怎么回填。
增量扩展成立,通常要同时满足三点:旧字段仍有历史数据价值,前端和后台读取逻辑可以兼容空值,数据库或内容模型允许新增字段而不影响已有查询。满足时,比较稳妥的顺序是:先加可空字段,再补默认值和回填脚本,最后才改前端展示。这样即使回填中途发现问题,旧页面仍能正常打开。
反例也很明确:假设旧系统里“客户编号”同时被用于登录、订单归属和财务对账,新需求想把它拆成“登录账号”和“结算主体”两个字段。此时直接加字段并不能解决,因为历史订单无法自动判断应归到哪一个新字段。只要有一个下游系统按旧编号取数,增量扩展就会把歧义带到对账环节。遇到这种反例,正确动作不是继续加列,而是先冻结旧字段的写入,建立新旧字段映射表,再安排一次集中迁移。
旧内容、旧系统和旧合作关系需要退出时,不要按“新旧”一刀切。先保留三类东西:仍被外部引用的字段、能追溯历史记录的主键、以及已经产生对账结果的数值字段。可以退出的通常是重复的展示字段、无人读取的备注字段、以及只服务于旧页面样式的冗余字段。
实际操作可以按这个顺序:
这个顺序的关键结果是:任何一步出问题,都能退回上一步,而不是只能回滚整站。对马鞍山本地的中小型站点来说,这比一次性重构更容易控制风险。
回填脚本跑完不等于迁移成功。要继续下一步,至少要看三件事:新字段的空值比例是否集中在可解释的范围;抽样记录在旧页面和新页面显示是否一致;下游取数方是否确认能读取新字段。如果空值集中在某一段时间或某一类业务,说明映射规则还不完整,应先补规则,而不是直接切换。
这里可以用一个假设例子说明比较方法:假设旧表有一万条记录,回填后新字段有八百条为空。不要只看“空了八百条”,而要按来源渠道分组。如果八百条全部来自同一个旧接口,那更可能是接口映射遗漏;如果分散在所有渠道,则要检查默认值规则。这个判断会影响下一步:前者去修接口,后者去修回填逻辑。
如果新增字段需要第三方配合,而对方只按旧字段返回数据,继续在本地加字段不会让数据变完整。此时应暂停前端改版,先确认三件事:对方能否新增返回字段、历史数据由谁负责补齐、切换期间以哪一方数据为准。只有这三件事有明确答复,扩展才不会变成长期双轨维护。
下一步动作建议:先写一份字段变更清单,列出新增字段、保留字段、停用字段和对应负责人,再拿这份清单去和开发、运营及外部接口方逐项确认。确认完成后,再决定是继续增量扩展,还是转入迁移方案。这样做的结果是把“字段不够用”从页面问题还原成数据责任问题,避免上线后反复补丁。