先给结论:字段不够用,不要在原表上直接加一列就完事。正确顺序是先判断新字段属于哪一类数据,再决定是加可空列、建从表,还是把整块数据迁到独立结构。判断依据是:新字段是否每个主记录都必填、是否只服务少数记录、是否会被查询和筛选。下面用一个假设情境串起整个决策过程。
假设你有一个衡水本地的设备租赁站,上线时orders表只记了客户名、设备型号、租期、金额。上线三个月后业务提出:要记录每台设备的序列号、押金退还状态、以及客户所在区县。这三样东西看起来都是“加字段”,但处理方式完全不同。
判断的核心不是字段数量,而是基数关系:一条主记录对应一个值,还是对应多个值。对应多个值的,加列一定会在下一次业务变化时再次崩掉。
如果确定是主表属性,加列本身不难,难的是加完之后数据怎么填、代码怎么读。动手前先确认:
这一步的结果直接决定下一步:如果历史数据补不齐、写入方又太多,那说明这个字段不该塞进主表,应该走从表或独立配置,避免污染核心结构。
从表不是越拆越好。拆分的代价是每次读取都要关联,列表页和导出会变慢,代码也变复杂。可以用一个简单的比较来定:
假设你的订单平均每单租1.2台设备,但旺季会到5台。如果按“平均1.2”去加三个序列号列,旺季就会溢出。这时从表是唯一稳妥选择,代价是列表页要多一次关联查询——这个代价可以用冗余字段缓解,比如在订单表里存一个“设备台数”,列表页只读这个数,详情页才去查从表。
涉及数据搬迁时,最危险的做法是停机改表、一次性切代码。更稳的顺序是分四步:
双写期间要接受短暂的数据不一致风险,所以回填脚本必须可重复执行——重复跑不会产生重复明细。这一步做扎实,后面的切换才有退路;如果回填结果对不上,就说明字段语义在旧数据里本身就不统一,需要先定规则再继续。
如果这已经是第三次为同一块业务加字段,而且每次都要改表单、改接口、改导出,那问题不在字段,在模型。信号很明确:新需求总以“再加一个属性”的形式出现,且这些属性彼此相关、会随时间变化。这时应该把这块数据整体抽成独立实体,让属性变成行而不是列。
反过来,如果只是偶尔补一个展示用的小字段,且不影响查询和统计,加可空列就是成本最低的选择,不必为了“规范”去过度拆分。判断标准始终是:下一次业务变化来时,这个结构还撑不撑得住。