先判断一件事:现有字段不够用,是因为业务对象本身变了,还是只是展示方式不够灵活。若是前者,扩展字段结构不可避免;若只是后者,优先改查询与展示层,别急着动表。这个判断决定后续是低成本调整还是必须做一次受控的结构迁移。
第一种是语义缺口:新业务需要记录一个原来不存在的属性,例如订单原来只记收货地址,现在要区分“发票抬头”和“收货联系人”。这类需求无法靠拼接旧字段解决,必须新增字段或新增关联表。
第二种是组合缺口:数据其实已经存在,只是当前页面、报表或接口没有把它们组合出来。例如用户表里已有注册来源和设备类型,运营却想看“来源×设备”的转化。这时新增字段反而制造冗余,正确动作是补索引、补视图或调整查询。
区分依据可以这样验证:把需求写成一句“系统需要知道什么”。如果这句话里的名词在现有结构中找不到落点,是语义缺口;如果名词都在,只是没被一起查询,是组合缺口。
当新属性与原有记录是一对一关系,并且大多数记录都会填,新增列最简单。假设一个活动报名表原来只有姓名和电话,现在要加“是否需接送”,这一列对每条报名记录只有一个值,直接加字段即可,历史数据留空并明确默认值。
当新属性是一对多关系,例如一个客户对应多个联系人、一个商品对应多个规格,就该新建关联表,而不是在主表里加“联系人1、联系人2”这类列。判断标准是:未来数量会不会增长。会增长就拆表,不会增长才留在原表。
实施动作按顺序做:先在测试环境加字段或建表,写入少量新旧混合数据,再跑一遍依赖该表的查询和导出。如果导出报表出现重复行或空值异常,说明关联关系没处理干净,此时不要直接上生产,先修正连接条件。这个动作的结果会决定是否需要同步改造写入接口,而不是只改数据库。
例外情况:如果该字段只用于内部临时统计,且不影响对外接口和结算,可以先用独立统计表承接,避免改动核心表结构。
组合缺口常见的误判是“加个字段存结果”。例如运营想看某类内容在不同终端的阅读分布,而日志里其实已有终端标识和内容标识。此时正确动作是确认这两个字段是否可被联合查询,必要时补联合索引或建汇总表。
动作与结果:先在一个只读副本或离线数据集上跑一次目标查询,记录返回时间和结果行数。如果结果正确但明显偏慢,再考虑索引或预聚合;如果结果本身对不上,问题在数据采集环节,加字段也解决不了。这一步的结果决定下一步是优化查询还是回补采集。
当组合查询涉及多个来源且实时性要求不高时,用定时汇总表比每次实时联表更稳。需要明确假设:汇总周期内的数据允许延迟,且业务不要求逐条实时一致。
扩展数据字段不是一次性的技术动作,而是对业务语义的重新确认。先确定缺口类型,再选择加列、建表或只改查询,才能避免把展示问题误当成结构问题,也避免把结构问题拖成长期补丁。