先判断一件事:新字段是补充描述已有业务对象,还是代表一种新的业务对象或新的关系。前者通常可以增量扩展,后者往往意味着要重做数据模型,甚至重做部分页面和录入流程。判断错了,扩展会变成反复打补丁。
上线后字段不够用,表面看都是“少了一列”,但成因不同,处理方式完全不同。
判断方法很简单:把新需求写成一句业务描述,看主语和宾语是否还是原来那两个。如果主语宾语都没变,只是多了修饰,多半是属性遗漏;如果出现了新的主语或新的“一对多”“多对多”,就要按结构变化处理。
增量扩展成立的条件是:旧数据仍然有效,新字段可以为空或有合理默认值,且现有查询和页面不需要重写。
具体动作可以这样安排:先在测试环境加字段并写入几条模拟数据,然后检查三件事——列表页是否报错、导出功能是否漏列、旧记录的编辑页是否能正常打开。如果这三项都通过,再考虑上线。假设一个产品表原本只有名称和价格,现在要加“材质”,旧产品暂时不填,那么列表页只要不强制显示该字段,就不会影响已有功能。
这个动作的结果会直接影响下一步:如果测试环境里旧记录编辑页打不开,说明代码里存在对字段数量的硬编码假设,此时不应继续加字段,而要先解除这类假设。
当出现下面任一信号时,增量加字段通常不够用:
这时更稳妥的做法是新建关联表或明细表,把原来的单条记录拆成主表加子表。改写数据模型意味着要处理历史数据迁移:旧记录需要按规则生成对应的子记录,或者保留为空并在页面上提示“待补充”。迁移脚本必须先在副本库上跑一遍,核对记录条数和关键字段是否一致,再决定是否在生产库执行。
需要说明的是,迁移后旧页面的查询如果仍指向原表,可能返回不完整结果。因此改写模型和调整查询应当作为同一个变更批次来安排,而不是先改表再慢慢改页面。
退出不是指关站,而是指放弃在当前数据结构上继续扩展,改用另一套数据组织方式或另一个承载系统。适用前提是:扩展成本已经接近重建成本,且重建后能覆盖可预见的下一批需求。
一个可操作的比较方法是:分别列出“继续加字段”和“重建数据结构”各自需要改动的页面数量、需要迁移的历史记录数量、以及上线后需要人工补录的数据量。如果继续加字段的改动点数量已经超过重建,且历史数据本身质量较差、补录价值不高,那么重建更合理。
反之,如果历史数据量大且仍在频繁使用,重建的迁移风险会很高,此时宁可接受结构上的不完美,用中间表或视图先满足新需求。这个取舍没有统一答案,取决于历史数据是否还在一线业务中被依赖。
无论选择哪种方式,上线后要验证的不是“新字段能不能填”,而是旧数据在新结构下是否仍然可读、可编辑、可导出。具体动作是:随机抽取若干条上线前创建的记录,逐一打开编辑页、执行一次导出、并在前台查看展示效果。如果导出结果里旧记录的对应列为空但格式正常,属于可接受;如果导出直接失败或列错位,说明扩展引入了兼容问题,需要回退或补兼容逻辑。
这个验证结果决定了下一步是继续补充新功能,还是先修复兼容性。不要在新字段尚未验证稳定之前,就并行开发依赖它的统计或报表功能。