字段不够用,通常不是数据库“满了”,而是业务对象在最初建模时被压扁了。扩展前先判断两件事:新增字段是原对象的补充属性,还是已经变成需要独立生命周期的新对象。前者可以加列或加附表,后者应拆表并调整录入界面,否则后续查询、统计和权限都会继续扭曲。
第一种是同一实体缺属性。例如渭南一家做本地配送的站点,上线时商品表只有名称、价格、库存,后来要记录保质期、批次和供应商。这些仍属于商品或批次属性,适合在现有结构上扩展。第二种是原表被迫承担了不该承担的角色。例如把每次报价都塞进客户表的备注字段,等到要比较不同时间、不同业务员的报价时,备注无法稳定检索。
两种情况的处理成本差别很大。补充属性可以增量迁移,旧数据给默认值或留空;角色混淆则往往需要新建表、回填历史数据、改写入逻辑和列表页。判断依据不是字段数量,而是这个字段是否会被单独查询、排序、统计或授权。
拿一张纸列出最近三个月里,运营或业务人员实际提出的取数需求。如果需求集中在“把某个信息显示出来”,多半是属性缺失;如果反复出现“按某个维度分组”“看每次变化”“不同人看到不同范围”,说明需要独立实体。另一个证据是修改频率:同一个字段是否会被多次覆盖,覆盖后是否还需要保留旧值。需要留痕的,就不应继续放在主表的一个列里。
还可以看录入端。若新增内容必须和原记录一一对应,加字段即可;若一条原记录会对应多条新内容,例如一个客户对应多次跟进、一个商品对应多个批次,就应建子表。这个判断不依赖具体数据库品牌,也不依赖某种建站程序是否自带某功能。
在缺少完整数据或数据库权限时,不要直接改生产表结构。可以先在后台新增一个只读的扩展区,用键值对形式保存新信息,例如field_name与field_value,并记录创建时间。这个动作的结果是:新数据可以先录入,旧数据保持原样,前端展示暂时不受影响。下一步再根据实际查询频率,决定哪些键值对值得提升为正式列或独立表。
需要说明适用条件:键值对适合低频、展示型、不需要复杂索引的补充信息;如果某个字段很快要参与筛选、排序或权限判断,继续放在键值对里会让查询变慢且难以维护。此时应停止继续堆积,转入正式建模。
假设某站点上线时只有客户表,备注列用来写报价。后来业务要求按月份统计报价次数,并保留每次修改。此时继续在备注里追加文本,无法稳定得到月份和金额。合理做法是新建报价表,包含客户标识、金额、报价时间、业务员标识,再把历史备注中能解析的部分回填,不能解析的保留原文并标记待人工确认。
这个例子的数字只用于说明比较方法:如果历史备注有一百条,能解析出六十条,剩下四十条不应当被当作“解析失败率”来证明系统有问题,它只说明原始录入缺少约束。扩展后的下一步是给新报价表加必填校验,而不是继续优化备注解析。
不能因为某次查询变快就断定整体设计正确,也不能因为旧数据暂时没有回填就认为扩展失败。请求量或抓取量归零,可能来自入口调整、缓存、权限变化或统计口径改变,不能单独作为字段设计对错的证据。真正可靠的信号是:新需求能否在不改写入逻辑的前提下被表达,以及旧数据是否仍可解释。
如果以上判断仍缺少依据,最小动作是先在测试环境复制一份数据结构,用真实但脱敏的少量记录跑一遍扩展和回填,再决定是否进入生产变更。