先给结论:不要急着在旧表上直接加字段,也不要一上来就拆表重做。更稳妥的做法是先把“字段不够用”拆成三类问题——是采集缺失、存储结构受限,还是展示与查询方式不匹配。只有确认瓶颈在哪一层,才能决定是补字段、加扩展表,还是迁移到更灵活的结构。下面的判断依据和动作顺序,都以你手上正在维护的那张表或那个页面为对象。
打开数据库结构或后台表单,对照最近三个月真实提交的数据,逐条看新增需求落在哪里。常见有三种:
varchar(50),实际需要几百字。判断动作:随机抽二十条记录,把新需求逐项尝试填入现有字段。凡是“填不进去”或“填进去后无法单独查询”的,就是真实瓶颈。这个动作的结果直接决定下一步——如果多数属于采集缺失,改前端和接口即可;如果属于结构不匹配,就要考虑加关联表。
面对结构不匹配,通常有两条路:在旧表加字段或加扩展表,或者迁移到更规范的多表结构。两者都成立,但适用条件不同。
适合以下情况:新需求数量少且稳定,历史数据可以接受为空;线上服务不能长时间停机;团队对现有代码熟悉,改动能在一两天内验证。代价是字段会逐渐碎片化,查询时需要不断拼接,几个月后可能再次遇到同类问题。
适合:新需求会持续增加,一条主记录对应多个子项;已有数据需要保持一致性,不能长期容忍空值;团队有能力做数据迁移和回滚。代价是改动面大,需要停机窗口或双写过渡,测试成本明显更高。
一个注明假设的短例子:假设订单表要记录多个物流节点,若只是偶尔补一个“最新状态”,加字段足够;若每个订单可能有五到十个节点且要按时间查询,加字段就会失控,此时建一张物流节点表更合理。这不是真实项目结论,只是说明比较方法。
以你手上那张需要扩展的表为例,按顺序做四步:
ALTER TABLE 新增可空列;结构不匹配则新建关联表,保留旧字段作为过渡,先写入新表再回填历史数据。其中第二步的动作结果最关键:如果迁移脚本能在测试库完整跑通并回滚,下一步才值得安排线上窗口;如果回滚失败,应退回到加扩展表的方案,先保证服务可用。
字段加完不等于问题结束。回到页面和查询入口,确认三件事:新字段在列表和详情页是否正常显示;按新字段筛选时结果是否准确;导出或对接下游时是否包含新列。若发现某字段长期为空,先检查表单和接口是否真的写入,而不是马上再改结构。请求量或写入量短时下降,也可能是缓存、发布窗口或采集延迟造成的,不能单独作为判断扩展是否成功的依据。只有在真实数据持续写入、查询和展示都符合预期后,这次扩展才算完成。