字段不够用通常不是“数据库要推倒重来”,而是当初把一类信息压进了单个文本字段或固定枚举,后来业务需要拆分、筛选或统计。能否在原表上平滑扩展,取决于这个字段现在是否已经承载了业务逻辑,以及历史数据能否被可靠地重新解释。
看起来都是“存不下了”,但处理方式完全不同。容量问题指字段本身够用,只是长度或数量上限被顶到,比如备注字段写满、图片数量到顶。结构问题指字段的语义已经装不下新需求,例如原来用一个“规格”文本框记录颜色和尺寸,现在要按颜色单独筛选、按尺寸单独排序,这时加长字段没有意义。
区分方法很直接:问一句“新需求是对已有信息做更细的拆解,还是对同一类信息要更多条”。前者是结构问题,后者多半是容量问题。判断错了,就会出现在文本字段里继续拼接内容、再用模糊匹配查询的局面,短期能跑,长期每次统计都要靠字符串处理,出错概率随数据量上升。
路线一:在原表增列或拆列。适用于新维度数量有限、且能对历史数据给出确定的映射规则。例如原来“联系人”一个字段,现在要拆成姓名和电话,如果历史数据格式统一,可以用一次脚本按分隔符拆分并人工抽检。成立条件是历史数据可解释、新字段数量稳定、查询以精确匹配为主。
路线二:抽成独立的关联结构。适用于同一实体要挂任意多条属性,且属性种类还会继续增加。例如产品要挂多个参数,参数名和参数值都不固定。成立条件是团队能接受多一次关联查询、后台编辑界面需要相应改造、并且愿意为属性名建立受控词表,否则会从“字段不够用”变成“属性名五花八门”。
两条路线不是先进与落后的关系。字段数量少、变化慢时,增列的可维护性往往更高;一旦出现“每个客户要填的参数都不一样”,继续增列就会让表结构不断膨胀,这时关联结构才更合适。
要判断该走哪条路,可以收集三类证据,而不是凭感觉决定。
一个常见的误判是:看到某个统计查询变慢,就认为必须改表结构。查询变慢还可能来自数据量增长、缺少合适索引、或查询本身写得过宽。改结构不一定解决慢的问题,先确认慢的查询是否真的需要新字段参与条件,再决定动不动表。
假设某站点原来用 remark 一个文本字段记录客户来源和意向等级,格式为“来源-等级”。现在运营要按来源分别统计转化,还要按等级筛选列表。此时有两种做法:
source 和 level 两列,写脚本按分隔符回填历史数据,保留 remark 一段时间用于核对,确认无误后再停用。如果来源种类目前只有几种且短期不变,第一种动作更小,回填后直接改查询条件即可,下一步只需在写入端加校验,防止新数据再写回旧格式。如果来源会不断新增、还要记录每个来源的附加信息,第二种更合适,但下一步必须先定义好来源的命名规则和维护权限,否则关联表会迅速失控。
无论选哪条路线,都要先处理双写与回填的过渡期。过渡期内旧字段和新字段可能同时存在,读取逻辑必须明确以哪一边为准,否则会出现同一记录在两个地方显示不同结果。可行的做法是:回填完成后,把读取统一指向新结构,旧字段只写不读或只读不写,并设定一个观察周期,确认没有依赖旧字段的隐藏逻辑后再清理。
扩展字段本身不难,难的是让历史数据、写入校验和读取逻辑在同一时间点对齐。先确认是容量问题还是结构问题,再用查询方式、历史数据和写入路径三类证据选路线,最后把过渡期的读取规则写清楚,这一步决定了扩展之后是变清爽还是变混乱。