结论先说:如果新增字段只是给已有业务对象补充说明性信息,并且现有记录不需要批量回填,通常可以直接加字段、改表单、发布上线;但如果新字段会改变业务对象的唯一性、关联关系或历史统计口径,就应该先停写、做迁移方案,再动线上结构。判断分界线不是字段数量,而是这个字段是否参与身份识别和跨表关联。
把要加的字段逐个过一遍,问三个问题:它是否决定一条记录是谁;它是否会被其他表引用;它是否会让过去的记录产生不同解释。三个都否,属于附加型扩展;任意一个是,属于结构型扩展。
附加型可以直接改。结构型要先冻结写入入口,把新旧数据分开处理,否则迁移期间新增的记录会落在旧结构里,迁移脚本跑完后这批数据就丢了。
假设一个做设备租赁的站点,上线时“订单”表只有一个“设备名称”文本字段。后来业务要求按设备型号统计出租率,于是新增“设备型号”字段并做成下拉选择。字段加上去了,表单也能提交,但过去两年的订单里“设备名称”是自由文本,写法不统一,无法自动映射到型号。结果新统计只能从上线当天开始算,历史报表出现断档。
这个反例说明:加字段这个动作本身很轻,重的是让旧数据在新口径下可用。如果业务方接受“从今天起重新统计”,扩展可以很快;如果不接受,就必须先做文本清洗和映射规则,再决定是否上线新字段。能否接受历史断档,是这里最关键的取舍条件。
不要直接打开数据库加列。先列出这个字段会经过的每一层:表单、接口、数据表、列表页、详情页、导出文件、统计报表、第三方对接。任何一层没有同步,都会出现“后台能存、前台不显示”或“导出缺列”的问题。
完成盘点后再执行。执行时先加可空字段,回填数据,再改表单和展示,最后才考虑是否改为必填。这个顺序让每一步都可以单独回退,而不是一次性把结构、数据和界面全部改掉。
如果盘点发现旧记录必须回填,下一步不是直接写更新语句,而是先导出旧数据做映射试验。用一小批记录验证映射规则,确认能覆盖多少比例、剩余部分如何处理。映射覆盖率决定后续选择:覆盖率高,可以自动回填后人工抽查;覆盖率低,就应该保留旧字段作为历史存档,新字段只对新记录生效,并在报表中注明口径变化时间。
如果盘点发现没有外部对接、旧记录也无需回填,那么下一步可以直接进入表单和展示层修改。改完后用一条新记录走完整流程:提交、入库、列表显示、详情显示、导出。任何一环缺失,都说明影响面盘点漏了对象。这个验证动作的成本很低,但能避免上线后再返工。
扩展数据字段不是一次性的技术操作,而是一次口径变更。先判断字段是否参与身份和关联,再决定是直接加还是先迁移;先盘点影响面,再决定回填策略。把这两步做完,扩展才不会在下一个业务变化来临时再次变成遗留问题。