结论先给:如果原有字段仍被历史数据、前端页面或对接方使用,优先新增扩展表或扩展字段,不要直接改动原字段含义;只有当旧字段从未被真实业务使用、且所有读写入口都能同步改完时,才适合直接改主表。判断依据不是字段数量,而是这个字段有没有承担过对外承诺。
字段扩展最怕的不是数据库改不动,而是改完之后有入口还在按旧含义写入。你要先列一张依赖清单,至少覆盖四类地方:
假设一个益阳本地的预约类站点,原来只有一个contact字段同时存手机号和微信号。业务变化后需要分别记录手机、微信、备用联系人。如果这个字段已经被导出给客服团队使用,直接拆成三个新字段会让旧导出脚本读不到值。此时正确动作是新增三个字段,保留contact并继续写入兼容值,等所有读取方切换完成后再决定是否停用。这个动作的结果是:扩展期间新旧逻辑并存,下一步才有条件做数据清洗,而不是先清洗再救火。
两者都能解决字段不够用,但适用条件不同。
适合加同表扩展字段:新增内容与主记录是一对一关系,查询时几乎总是一起取出,且字段数量增加有限。例如给订单加一个“交付方式备注”。
适合加旁表:新增内容是一对多、可重复,或者只有部分记录才需要。例如一个客户对应多个联系人、多个跟进记录。旁表的好处是主表结构稳定,坏处是列表页要多一次关联查询,导出逻辑也要跟着调整。
如果只是字段不够,却把所有新内容都塞进一个extra文本字段,短期省事,长期会让筛选、统计和校验都变困难。这个做法只在临时过渡、且明确知道后续会拆分时才成立。
前面说旧字段有外部依赖就不要改主表,但有一种情况会让这个结论失效:旧字段虽然存在,却从未被任何真实业务写入或读取,只是建站时预留的空列。此时直接重命名或改类型,成本反而最低。
怎么确认它真的没被用?不能只看代码里有没有出现字段名,因为可能存在动态拼接的查询、定时任务或人工导入模板。更可靠的做法是先记录一段时间的写入情况:如果该字段长期为空、没有非空约束、也没有出现在任何导出和接口返回中,才可以考虑直接改。但要注意,写入量为零也可能是采集或定时任务没跑,不能单独作为处理正确的证据,还需要结合任务日志和人工确认。
其中第 3 步是分水岭:它决定了你能否在不中断业务的前提下完成扩展。如果跳过双写直接切换,一旦发现遗漏入口,历史数据和新数据就会出现断层,后续补数据的时间通常远高于当初多写一段兼容逻辑。
字段能存进去不等于扩展成功。至少验证三件事:新字段在列表、详情、导出中是否一致;空值记录是否会导致页面报错;按新字段筛选时结果是否符合预期。如果站点同时有搜索引擎收录和平台推荐流量,字段变化影响的主要是页面可读内容与结构化数据,而不是直接带来排名变化,不要把扩展字段和流量增长混为一谈。
下一步动作很明确:先完成依赖清单和双写切换,再安排一次历史数据回填。回填脚本要先在小批量数据上跑通,确认映射规则无误后再全量执行;如果映射规则本身存在歧义,应暂停回填,先和业务方确认每个旧值对应哪个新字段,而不是靠猜测批量写入。