先判断一件事:现有字段里是否已经存了无法重建的历史数据。如果这些字段承载的是客户提交、订单备注、工单记录等一旦丢失就无法补回的内容,扩展必须以“保留原字段、并行新增”为默认路径;如果字段只是展示用的文案或可重新生成的配置,才轮到改写或退出。这个判断决定了你接下来是加字段、换结构,还是重建整张表。
字段不够用通常表现为三种情况,处理方式完全不同。
判断依据是问一句:如果这个字段的值明天全部消失,能不能从其他表、日志或线下记录里恢复?答案是否,就归入不可重建,走新增路线。
当不可重建数据占比高、且新旧字段可以共存时,保留加新增是唯一不会造成信息损失的做法。具体动作是:原字段保持不动,新字段用新的名称和类型加入,程序读取时优先取新字段,取不到再回落到旧字段。
这个回落逻辑会直接影响下一步。如果回落长期存在,说明旧数据始终没有被补齐,你需要在某个时间点决定是否做一次性回填;如果回落很快不再触发,说明新流程已经稳定,旧字段可以转为只读归档。假设一个表单原来只有“需求描述”一个长文本框,现在要拆出“预算区间”和“期望上线时间”两个结构化字段,那么旧文本必须原样保留,新字段允许为空,读取时先看新字段、为空再显示旧文本。这样既不丢历史提交,也不影响新提交进入结构化流程。
改写指的是复用同一个字段名,但改变它的含义或取值范围。它成立的前提有三个,缺一不可:旧值可以被程序无损转换;所有读取该字段的代码路径都能同步更新;没有外部系统或导出文件依赖旧格式。
常见的失败场景是只改了数据库和主站,却漏掉了导出报表、对接的第三方接口或定时任务,结果这些地方读到新格式后静默出错。因此改写的实际动作应该倒过来做:先列出所有引用该字段的位置,再决定是否改写。如果引用点超过你能一次核对的量,改写就不划算,回到新增路线更稳。
退出是指放弃现有表结构,按新需求重建,再把能迁移的数据搬过去。它适合字段混乱已经影响到日常查询、且不可重建数据比例很低的情况。比如早期把多个业务塞进一张宽表,现在每次加需求都要改表,维护成本已经超过重建成本。
重建前必须确认两件事:一是迁移后旧表要保留只读副本一段时间,而不是立即删除;二是要有一个可回退的时间点,一旦新结构上线后发现遗漏字段,能切回旧表继续服务。重建的代价主要不在写新表,而在核对迁移过程中丢了多少行、错了多少值。这个核对结果决定你是继续用新结构,还是回退后改用新增方案。
无论选哪条路线,动手前都应先盘点。具体做法是搜索代码库和配置中所有出现该字段名或表名的地方,记录每个引用点是读、写还是导出。盘点结果会告诉你:引用点集中在少数文件,改写可行;引用点分散且包含你不熟悉的模块,新增更安全。
盘点还有一个作用:它会暴露那些你以为没人用、实际仍在跑的旧任务。这些任务往往就是扩展后数据错乱的来源。先处理它们,再动字段,顺序不能反。
回到最初的问题:字段不够用不是立刻改表,而是先按“能否重建”给字段分类,再按引用点的集中程度选择新增、改写或重建。分类结果和盘点结果共同决定动作,动作执行后再用回落是否触发、迁移是否丢行来验证选择是否正确,并据此决定下一步是回填、归档还是回退。