先判断一件事:这次扩展是“补字段”还是“改结构”。如果新需求只是多存一个值、多筛一个条件,通常可以在原表上加字段并保留旧数据;如果新需求会改变一条记录与其它记录的关系,比如一个客户对应多个联系人、一个产品属于多个分类,那就不能靠继续加列解决,应新建关联表并把旧字段迁移过去。判断依据不是字段数量,而是新数据是否与旧数据形成一对多或多对多。
选一个已经上线、且最接近新需求的页面,例如产品详情页或询盘表单。把页面上每个输入项、展示项、筛选项分别写下来,再标注三件事:谁写入、谁读取、是否允许为空。这个动作的结果会直接决定扩展方式——如果某个字段只有后台运营会看,前台从不展示,它可以先加在副表里;如果它同时参与前台筛选和列表排序,就要考虑索引和查询成本,而不是随手加一列。
假设一个企业站的产品表原本只有名称、分类、价格、简介。上线后运营提出要按“适用行业”“交付周期”“是否支持定制”筛选。此时不要急着在原表加三个字段,而要先确认:一个产品是否可能属于多个行业?如果可能,加列就会把多个值塞进一个字段,后续筛选只能靠模糊匹配,越用越乱。
路线一:原地加字段。成立条件是新增数据与原有记录保持一对一,且旧记录可以用默认值或空值兼容。代价是表会变宽,查询和后台表单会变长;如果旧数据没有回填,前台筛选会出现“未填写”的空档,需要额外处理。适合字段少、关系简单、短期内不再大改的情况。
路线二:拆出关联表。成立条件是新增数据与原有记录是一对多或多对多,或者新字段只服务于某一类记录。代价是需要改写入逻辑、迁移旧数据、调整查询语句,工作量明显更大。但它的好处是后续再加同类维度时,不必反复改主表结构。适合字段会持续增加、且需要精确筛选的场景。
一个可操作的判断动作:把新需求写成一句关系描述,例如“一个产品可以属于多个适用行业”。如果这句话成立,就选路线二;如果只能写成“一个产品只有一个适用行业”,路线一就够用。这个判断做完,下一步才是决定迁移顺序,而不是先改代码。
确定路线后,先复制一份旧数据做演练,不要直接改生产库。演练要验证三件事:旧记录迁移后是否还能正常展示;新字段为空时前台是否报错;按新条件筛选时结果是否符合预期。假设旧产品表有 200 条记录,其中 30 条没有“适用行业”信息,迁移后这 30 条在前台筛选“全部”时仍应出现,只在选择具体行业时被排除。如果做不到这一点,说明默认值或查询条件需要调整。
演练结果会直接影响下一步:如果旧数据迁移后展示正常、筛选边界清楚,就可以安排正式迁移和回填;如果出现大量空值导致列表断裂,应先补一轮数据清洗,再谈扩展。这个顺序不能颠倒,否则上线后前台会出现无法解释的空列表。
字段扩展不是一次性的技术动作。新增字段后,后台表单、内容审核、数据导出和前台展示都要同步更新。具体动作是:在后台把新字段设为必填或选填,并写清楚填写规则;在导出模板里加入对应列;在前台确认筛选和排序不会因为空值出错。做完这些,再观察一段时间内新提交的数据是否完整。如果大量记录仍然为空,说明填写入口或规则没有被执行,需要回到表单设计上调整,而不是继续加字段。
最后要接受一个现实:字段设计很难一次到位,但可以控制扩展的代价。把关系判断放在加列之前,把迁移演练放在上线之前,把维护规则放在扩展之后,这三步能让后续每次调整都有依据,而不是靠不断打补丁维持。