先判断一件事:现有字段缺的是“展示位”还是“数据结构”。如果只是前台没地方显示,改模板即可;如果是后台根本无法录入、查询或导出这类信息,就必须扩展数据模型。扩展前先冻结写入,扩展后先做双写校验,再切换读取,这样能把对已有业务的影响压到可控范围。
选一个已经上线、业务方抱怨最多的页面,比如产品详情页或服务介绍页。把页面上出现的每一项信息列出来,再对照后台可录入的字段。你会看到三种情况:
只有第三种情况才值得改库。前两种如果也去加字段,会让表越来越宽,后续维护成本反而更高。判断标准很简单:这个信息是否必须由人工在后台独立录入,或者必须由外部接口单独传入。答案是“是”,才进入下一步。
确认要加字段后,有三条路,选择取决于数据量、查询频率和改动风险。
适合字段数量少、查询频繁、且表的数据量不大的情况。例如给产品表增加一个“适用场景”文本列,列表页需要按它筛选。优点是查询简单、索引直接。代价是每次扩展都要改表结构,如果表已经有几十万行,加列和回填可能锁表或耗时较长,必须安排在低峰期,并先备份。
适合一个主体对应多条可变信息的情况。例如一个服务项目要记录多条“服务流程步骤”,每条有标题和说明。这时不该在主表里加“步骤1、步骤2、步骤3”,而应建一张步骤表,用主体 ID 关联。判断依据是:这类信息未来会不会增加条数?会,就用附属表。它的代价是查询要联表,前台渲染逻辑也要相应调整。
适合字段高度不固定、查询需求弱的补充信息。例如每个页面偶尔要挂一条“备注”。优点是加信息不用改表。代价是无法有效建立普通索引,复杂筛选会变慢,也不利于数据校验。它适合“存得下就行”的场景,不适合作为核心业务字段的长期方案。
假设一个黄石本地的制造企业网站,产品表原本只有名称、图片、简介。上线后业务方要求每个产品增加“规格参数”,而且不同产品的参数项不一样。这时用 JSON 字段能快速上线,但如果前台需要按某个参数筛选产品,就应该改成附属表,把参数名和参数值各存一列。这是两种选择成立的不同条件,不是谁绝对更好。
很多扩展出问题,不是因为字段设计错,而是因为改的过程中旧数据还在变。执行顺序建议如下:
如果无法暂停写入,就要采用兼容式扩展:先加允许为空的新字段,不删除旧字段,让新旧逻辑并行。等确认新字段数据完整后,再逐步切换读取来源。这个动作的直接结果是:出问题时可以退回旧字段继续服务,而不是只能回滚整张表。
结构改完不等于数据对。对关键字段,建议在一段时间内同时写入新旧两处,然后抽查比对。比如新增“联系人手机”字段后,让表单同时写入旧备注字段和新字段,再随机抽取若干条记录,核对两边是否一致。发现不一致时,先查写入逻辑,而不是急着删旧字段。
这里要避免一个误判:如果新字段的查询结果为空,不能直接断定扩展失败。可能的原因包括旧数据尚未回填、写入逻辑只对新提交生效、缓存未刷新、或者查询条件本身写错。把这些原因逐一排除后,才能确认是结构问题。回填旧数据时,也要明确哪些记录无法自动推导,需要人工补录,并给这部分留出操作入口。
扩展完成后,回头更新两样东西:一是数据字典,写清每个字段的含义、来源、是否必填、能否为空;二是后台录入界面的校验规则,避免新字段被随意填写。下次再遇到“字段不够用”,先查数据字典,判断是遗漏、是映射问题,还是业务真的变了。只有业务规则发生变化,才值得再次改动结构;否则优先用展示层或转换层解决。这样每一次扩展都有据可查,而不是反复改表。