如果原字段仍能承载旧数据、新增需求只是补充属性,那么可以走“加字段、不动历史结构”的扩展路线;如果新需求改变了记录之间的从属关系,例如原来一条内容只属于一个分类、现在要同时挂多个分类并分别排序,那么继续加字段会让查询和维护越来越绕,应转为拆表或引入关联表。判断依据不是字段数量,而是新数据是否与旧数据共享同一套唯一标识和生命周期。
缺属性指同一类记录还需要多存一列信息,比如房源原来只记面积,现在要分别记建筑面积和套内面积。此时新增可空字段、给旧记录留空或设默认值,通常风险最小。缺关系指一条记录要对应多条子记录,比如一个商品要挂多张不同用途的图片、一个项目要对应多个参与单位。若继续用“图片1、图片2、图片3”这类并列字段,读取时要写死列名,排序和筛选也会变得别扭,属于结构问题,不是字段不够多。
在缺少完整历史数据或数据库权限时,不要直接改主表。可以先建一张扩展表,用与原记录相同的主键关联,只放新增字段。随后分批回填:能自动推导的按规则写入,不能推导的保留空值并标记待补。这样做的结果是线上读取逻辑可以逐步切换,旧页面不受影响,也便于回退。需要说明的是,扩展表里出现大量空值,只能说明回填尚未完成,不能据此推断旧数据本身错误或业务方没有提供数据。
假设一个鸡西本地服务类站点,原来咨询表单只存姓名和电话,后来要区分咨询来源、意向项目和跟进状态。若直接在主表加三个字段,历史记录会全部为空;若建扩展表,先只对新增咨询写入这三个值,再按时间倒序补旧记录。比较两种做法时,可以看“新增一条记录需要写几张表”“按意向项目筛选时是否需要跨表联查”,而不是只看字段总数。
如果新需求要求同一字段支持多值并参与排序,例如一个项目要对应多个标签且标签有先后顺序,那么继续加字段就会失效:列名固定、数量固定,运营想加第四个标签时又得改表。此时更合适的是建立“项目—标签”关联表,把顺序作为关联表里的一列。反过来,如果只是增加一个备注、一个状态值,且每条记录最多一个值,加字段仍然成立。这个反例说明,扩展方式取决于基数,而不是取决于表里已经有多少列。
动手前先确认旧记录有没有稳定且唯一的主键,以及新增数据是否复用这个主键。若复用,扩展表或加字段都能走;若不复用,例如新增的是与原记录多对多的关系,就必须先设计关联表,再改读取逻辑。完成这一步后,再评估是否需要迁移历史数据、是否需要保留旧字段作为过渡。整个过程中,抓取量或请求量的变化不能单独证明结构改对了,还要看新增记录能否完整写入、按新条件筛选的结果是否符合预期。