先判断一件事:新字段是“补在现有结构上就够”,还是会改变已有数据的含义。如果只是增加一个可空的备注、来源或标签,保留现有表并加列通常最省事;如果新需求要求把原来一个字段拆成多个维度,或同一类内容要按不同规则重复出现,继续打补丁往往会让后续查询、导出和表单校验越来越难,这时应认真考虑改写结构,退出旧结构只适合旧数据可归档、新流程可以另起一套的情况。
保留的典型前提是:旧字段仍然成立,新字段只是补充信息,且历史数据允许为空。比如原来只记录“联系人”,现在想分别记录“联系人姓名”和“联系人职务”,如果职务并非每条都有,可以新增一个可空字段,旧数据不回填也能正常显示。
动作上,先列出所有读取该数据的位置:前台展示、后台列表、导出、筛选、统计和接口。新增字段后逐一确认这些位置是否需要同步调整。结果会直接影响下一步——如果只有后台录入和导出需要改,保留方案可以继续;如果前台筛选、统计口径也跟着变,说明新字段已经进入核心逻辑,保留的代价被低估了。
保留方案的常见代价是字段越来越多、命名越来越随意。判断是否还能继续加,可以看一个信号:新需求是否总在问“这个字段到底算哪一类”。如果同一个字段既要表达来源又要表达状态,说明它承担了两种含义,继续加列只会让含义更混乱。
改写适用于新需求改变了数据的组织方式,而不只是增加一个属性。典型情形包括:原来一条记录对应一个联系人,现在一条记录要对应多个联系人;原来用文本存规格,现在要按规格筛选和比较;原来一个字段混存了“地区+行业”,现在要分别统计。
这类情况下,合理的动作是先冻结新功能的开发,把现有数据按新结构做一次映射,再决定旧字段是迁移、保留只读,还是停止写入。映射过程中如果发现大量记录无法自动对应,说明改写不是单纯的技术调整,还涉及业务规则确认,此时应先把规则定清楚再动数据。
改写并不等于推翻整站。可以只重构涉及的那部分数据关系,其他模块保持不动。判断边界的方法是:看哪些页面和流程依赖这组数据。依赖越集中,改写的影响越可控;依赖越分散,越需要分批处理,而不是一次性全量切换。
退出旧结构适用于旧数据可以归档、新流程允许从零开始的情况。例如旧表单收集的字段已经不再用于任何当前业务,只是留作历史记录;或者旧数据质量差到无法可靠映射,强行迁移只会把错误带入新结构。
退出的前提是确认旧数据不再被任何现行流程读取。动作上可以先停止旧入口的写入,观察一段时间内是否还有页面、导出或接口在调用旧字段。如果没有,再考虑把旧数据转为只读归档。结果决定下一步:归档顺利,就可以在新结构上继续开发;如果仍有调用,说明退出条件不成立,应回到改写或保留方案。
需要提醒的是,请求量或抓取量下降不能单独证明旧结构已经无人使用。它也可能是入口调整、缓存变化或统计口径变化造成的。判断是否真的可以退出,应直接检查调用来源,而不是只看总量。
假设一个信阳本地服务类网站,上线时表单只设计了“联系电话”一个字段。后来业务需要区分“手机”“微信”“座机”,并且允许同一客户留多个联系方式。此时如果继续在旧字段上加列,会出现手机、微信、座机三列都为空或重复的情况,查询“这个客户有哪些联系方式”会变得别扭。
更合适的做法是把联系方式拆成独立的一组记录,每条记录包含类型和值,并关联到原客户。旧字段可以保留为只读展示,新提交走新结构。这个假设例子的关键不是照搬结构,而是说明判断方法:当新需求从“一个值”变成“一组值”时,保留加列的收益通常低于改写。
把这三个条件逐条对照后,选择通常就清楚了:能补则补,含义变了就改写,旧数据不再被读取才退出。下一步不是立刻动手改表,而是先列出所有依赖位置和旧数据的实际用途,再决定改哪一层、分几次上线。