先给结论:不要在原表上直接加字段就完事。正确顺序是先判断这次扩展属于“加值”还是“加关系”,前者可以增量补列并回填,后者必须新建关联表并迁移历史数据。判断依据是新增信息是否与原有记录一一对应——如果一条业务记录可能对应多个新值,就是关系变化,直接加列会在第二次使用时再次卡住。
打开后台里最常被编辑的那个内容表单,比如产品页或案例页。列出当前所有字段,然后逐条问:这个字段未来会不会出现“一条记录要填多个值”的情况?例如产品原先只填一个“适用行业”,现在业务要求同时标注三个行业。如果答案是会,那问题不在字段数量,而在数据结构把“多值”压成了“单值”。
另一种常见情况是字段类型选窄了。原来用单行文本存“规格”,现在要按长、宽、高分别筛选和排序,文本字段无法拆分计算。这两种原因的扩展方案不同:多值问题要加关联表,类型问题要改字段类型并迁移旧数据。先分清属于哪一种,再动手,否则加完字段仍然要返工。
第一,新增信息与现有记录是一对一还是一对多。一对一可以补列;一对多要建关联表。第二,旧数据是否必须保留可查询。如果历史记录允许只保留摘要,迁移成本会低很多;如果旧数据仍要参与筛选和统计,就必须写回填规则。第三,前台模板是否依赖字段顺序或固定名称。若模板里写死了字段调用,改结构会连带影响页面渲染,需要同步调整。
这三件事确认完,再决定动作。假设一个宿迁本地的设备展示站,原先产品表只有“型号”和“简介”,现在要按“功率”“电压”“接口类型”分别筛选。这时新增的是结构化属性,属于可枚举的一对多关系,适合建属性表,而不是在 product 表里加三列。这个例子只是说明判断方法,不代表任何具体项目的实际结果。
如果确认是一对一补列,动作是:新增字段并设置默认值,然后按业务规则回填旧记录,最后再开放编辑入口。回填完成前不要让前台读取新字段,否则会出现大量空值,影响筛选和展示。回填结果决定下一步——如果空值比例仍然很高,说明默认值规则不成立,需要回到业务侧确认旧记录是否真的适用新字段。
如果确认是一对多,动作顺序是:先建关联表,字段至少包含主记录标识、属性名、属性值、排序;再写迁移脚本,把旧字段里的值拆成多条关联记录;然后在模板层改为循环读取关联数据;最后保留旧字段一段时间作为回退依据,确认新结构稳定后再停用。每一步的结果都会影响下一步:迁移脚本跑完后要抽查记录条数是否与预期一致,不一致就先修脚本,不要急着改模板。
无论哪种路径,都要在测试环境先跑一遍完整流程,包括新增、编辑、筛选、导出。导出环节最容易暴露问题:如果导出模板仍按旧字段写死,扩展后导出的文件会缺列或错位,需要同步更新导出逻辑。
第一个信号:新增一条记录时,是否需要为了填满表单而编造数据。如果需要,说明字段设计仍然过细或过全,应该考虑把非必填项移到扩展属性里。第二个信号:筛选或统计时,是否还需要人工在结果里二次整理。如果需要,说明关联关系没有建完整,或者字段类型仍然不对。
这两个信号比“字段数量够不够”更可靠。字段多不等于结构对,能支撑业务查询和导出才是扩展成功的标准。如果扩展后仍然频繁出现临时加字段的需求,问题通常不在字段层,而在最初没有把业务对象之间的关系画清楚,这时应该停下来重新梳理数据模型,而不是继续加列。
当旧表已经承载了多个业务含义、字段命名混乱、且历史数据之间存在互相矛盾的关系时,继续增量扩展的维护成本会超过重建成本。判断条件可以看两点:一是同一字段在不同页面被解释成不同含义;二是新增一个属性需要同时改动三个以上模板或导出逻辑。满足其中一点,就值得考虑新建数据表并做一次性迁移,而不是在旧结构上继续打补丁。
重建不等于推翻前台。可以保留现有页面地址和展示结构,只替换底层数据读写方式。迁移期间旧表保持只读,新表承接新数据,确认新表数据完整后再切换。这个取舍的核心是:扩展解决的是“再加一个值”,重建解决的是“关系已经错了”。分清这两者,才能避免上线后反复返工。