先给结论:不要急着在原表加字段,也不要马上推翻重做。更稳妥的顺序是先判断“不够用”属于展示层缺字段、业务层缺结构,还是历史数据缺口径;只有确认新增字段会改变已有记录的含义时,才值得进入迁移或重构。多数情况下,先补一个可回退的扩展字段,比直接改原字段更能控制代价。
上线后反馈“字段不够”,通常有两种解释。第一种是展示层缺字段:页面想多显示一个来源、备注、有效期或分类,但数据库里没有对应列。第二种是业务层缺结构:同一张表既要放咨询记录,又要放订单跟进,字段开始互相借用,导致一个字段在不同记录里含义不一致。
这两种情况的证据不同。展示层缺字段的典型信号是:旧记录仍然完整,新需求只是多一个可选信息,补上后不影响已有查询。业务层缺结构的信号是:同一字段被不同角色填不同内容,或者出现“其他说明”里塞满关键信息的现象。前者适合增量扩展,后者继续加字段只会让表越来越难维护。
路线一是在原表增加可空字段。它的成立条件是:新增信息与原有记录是一对一关系,旧数据不需要回填也能正常展示,且查询逻辑改动范围小。代价是字段会持续增多,如果后续还要记录同一对象的多次变更,原表会变成宽表,阅读和迁移都更费劲。
路线二是新建关联表,把扩展信息按“一条主记录对应多条扩展记录”存放。它适合字段会重复出现、需要保留历史版本、或不同来源字段口径不同的情况。代价是查询需要关联,后台表单和前台展示都要同步调整;如果只是加一个固定备注,用关联表反而增加复杂度。
判断依据可以看三点:新信息是否只出现一次;旧记录是否必须补齐;未来是否可能继续增加同类字段。三点里有两项偏向“会继续增加”,就应优先考虑关联表。
假设一个闵行本地的服务预约站,上线后运营希望每条预约记录多记录“客户来源”和“跟进阶段”。如果直接在原表加两个字段,旧记录这两列为空,前台按空值隐藏即可,改动小、可回退。运行一段时间后,如果发现同一预约需要记录多次跟进,每次跟进还有不同负责人和时间,那么“跟进阶段”就不该继续留在原表,而应拆成跟进记录表,原表只保留当前阶段作为冗余展示。
这个动作的结果会影响下一步:如果可空字段上线后,运营仍持续要求增加同类字段,说明缺的是结构而不是列,此时再迁移比一开始重做更有依据;如果新增字段长期只有一两个,且没有多次记录需求,就停在原表扩展即可。
如果这三件事没有确认,直接加字段往往只是把矛盾推迟到下一次报表或接口对接时爆发。
出现以下信号时,继续加字段的代价会超过重构:同一张表已经有大量互相借用的字段;不同业务角色对同一字段的解释无法调和;导出、筛选和权限都开始依赖字段位置而不是字段含义。此时应先把现有字段按业务对象分组,再决定哪些留在主表、哪些拆到关联表。
重构不等于推翻前台。可以保留原表作为过渡,新增结构先承接新数据,旧数据按需迁移。这样即使迁移不彻底,前台仍能读取旧字段,不会因为一次扩展导致整站不可用。对闵行网站设计项目来说,真正要控制的不是字段数量,而是字段含义是否稳定、旧数据是否可解释、下一次扩展是否还有退路。