先给结论:字段不够用通常不是“加几个字段”就能解决,而是要先判断当初的数据模型是把可变信息写死在固定字段里,还是本来就该用关联表或键值结构承载。判断错方向,扩展一次会在半年内再撞一次墙;判断对方向,扩展可以做到旧数据不动、新数据平滑接入。
一个常见的反常结果是:给主表加了五六个新字段后,后台表单确实能填了,但列表页筛选变慢、导出对不上、旧记录大片空白,编辑开始抱怨“还不如不加”。这不是扩展本身有错,而是扩展方式暴露了原来的设计假设。
两个解释都成立,需要用证据区分。
不要凭感觉判断,去查三个地方。
LIKE '%...%' 或按固定位置截取,那就是结构在拖累查询,属于解释二。反过来,如果新字段每条记录最多一个值、旧记录补默认值后语义完整、查询仍能走索引,那更可能是解释一,直接补字段加回填即可,不必大动。
当证据指向解释二时,推荐的动作是新建关联表,把“多值”信息迁出去,主表只保留稳定字段。假设一个商洛本地的建材展示站,产品上线后要支持“同一产品对应多个规格、多个供货区域”。
假设做法:主表 product 不动,新增 product_spec(product_id、spec_name、spec_value)和 product_region(product_id、region_code)。前端先读主表拿到产品,再按 product_id 取规格与区域。旧产品没有规格时不报错,页面显示“规格待补充”,编辑在后台逐条补录。
这个动作的结果会直接决定下一步:如果补录后列表筛选和导出都恢复正常,说明结构问题已解决,后续只需维护这两张表;如果补录过程中编辑仍然需要在一个字段里塞多段文字,说明还缺一个自由备注表,继续拆分,而不是回头加列。
不必强求一次性迁移。可以按“先新后旧”的顺序:新录入的数据直接进新结构,旧数据在编辑下次修改该条记录时顺带补齐。这样做的代价是短期内两套数据并存,查询需要兼容空值;好处是不用停机、不冒批量清洗出错的风险。
需要设一个收敛条件,比如“当超过一定比例的旧记录已被编辑触碰过,再评估是否批量回填”。这个比例是内部管理阈值,不是行业标准,按团队维护能力定即可。关键是别让并存状态无限期拖下去,否则查询兼容代码会比字段问题更难拆。
回到最初的问题:上线后字段不够用,先别急着加列,用命名史、真实取值和查询写法判断是补默认值还是拆关联表;选对方向后,扩展才不会在下一个需求里再次失效。