字段不够用,通常不是“数据库加一列”那么简单,而是要先判断这次扩展属于补录型、兼容型还是重构型。三种判断对应完全不同的动作:补录型可以增量上线,兼容型需要双写过渡,重构型则要安排旧数据迁移和旧入口退出。判断依据不是字段数量,而是新字段是否参与检索、是否影响已有记录的含义、以及旧合作关系是否还需要读写同一批数据。
上线后报字段不够,常见有两种解释。第一种是字段确实缺失,原有表结构里没有承载某类信息的位置,比如早期只记录联系人姓名和电话,后来需要区分咨询来源、跟进状态和意向等级。第二种是字段还在,但被复用了太多含义,比如一个备注字段同时承担内部说明、客户原话和渠道标记,导致筛选和统计都不可靠。
这两种解释的区分证据很直接:看现有数据里同一字段的取值是否混杂了多种用途。如果同一列中既有自由文本又有结构化标记,问题属于语义被撑坏,单纯加新列并不能解决旧记录的歧义;如果现有列取值干净、只是缺少新维度,才属于真正的字段缺失。前者要先定义新字段的边界,后者可以直接进入扩展方案。
第一个条件是新字段是否参与查询和筛选。只用于后台备注的字段,可以先用可空列接住,再逐步补录;一旦要用于前台筛选、列表排序或对外展示,就必须同时考虑索引、默认值和空值展示规则,否则上线后会出现筛选结果缺失或排序错乱。
第二个条件是新字段是否改变旧记录的含义。如果旧记录原本没有这个维度,新字段对它们只能是“未知”,不能默认填成某个业务值,否则历史统计会被污染。可以保留空值,并在展示层明确区分“未填写”和“已填写为空”。
第三个条件是旧合作关系或旧系统是否还在写入同一批数据。只要还有旧入口在写,就要决定是双写过渡、只读冻结,还是让旧入口继续写入但不再扩展。这个决定会直接影响下一步的迁移顺序。
假设某站点早期只有一张咨询记录表,字段为姓名、电话、备注。运营一年后需要按来源渠道、跟进阶段和下次联系时间做筛选。此时如果直接在备注里加标记,短期看似省事,但筛选只能靠模糊匹配,统计口径会越来越乱。
更稳妥的动作是新增三个独立字段,并保留备注字段不动。上线时先让新记录写入新字段,旧记录的新字段留空;随后用一次人工或脚本回填,把备注中能明确识别的来源和阶段迁移过去。回填结果会决定下一步:如果大部分旧记录无法可靠拆分,就应把旧记录标记为“历史数据”,只在新记录上启用筛选,而不是强行统一口径。
扩展字段往往伴随旧入口退出。退出不等于全部删除,可以按三层保留:第一层保留原始数据快照,确保旧记录可追溯;第二层保留仍然有价值的字段,比如客户历史联系记录;第三层让旧写入入口进入只读或停用状态。判断某部分是否保留,看它是否还被新流程引用,而不是看它是否曾经重要。
如果旧合作关系还需要读取数据,可以先提供只读视图,而不是继续开放写入。只读视图能减少新字段被旧逻辑覆盖的风险,也给对方留出迁移时间。这个动作的结果是:新系统可以独立演进字段结构,旧合作方仍能完成查询,但不再产生新的格式冲突。
验证不只看新字段能否写入,还要看旧记录的展示、筛选和导出是否仍然一致。可以抽一组旧记录,分别在新旧入口查询同一条件,比较结果数量是否相同。如果数量不同,先查默认值和空值处理,而不是直接归因于数据丢失。
另外要观察写入失败和空值比例的变化。写入失败上升可能来自新字段的非空约束,空值比例高则说明补录还没完成。两者都不能单独证明扩展正确或错误,需要结合具体字段的必填规则来判断。确认旧数据可读、新数据可写、筛选口径一致之后,再决定是否关闭旧入口或进入下一轮字段调整。