先别急着改数据库。把当前页面导出一份真实数据,逐列标注“谁在用、用来做什么、缺了会怎样”,通常能发现不够用的不是字段数量,而是某类信息被塞进了备注或标题里,扩展时应先把这类信息拆成独立字段,再决定是否新增表。
字段不够用有两种表现。一种是确实没有对应栏位,比如产品页只有“价格”没有“起订量”;另一种是结构错位,比如把规格、材质、交期全写进一个“备注”字段,前台靠人工拆分展示。后者更常见,也更危险,因为每加一个筛选条件都要重新解析文本。
判断方法很直接:打开后台任意一条记录,看哪些列的值是“一句话里包含多个信息”。如果一列里出现顿号、斜杠、换行,且这些片段在别的页面要单独显示,它就应该是独立字段。这一步的产出是一张字段清单,而不是马上写迁移脚本。
以一份产品列表为例,按下面顺序处理:
完成后你会得到类似这样的定义,用来说明意图即可,不必照抄:
moq INT NULL DEFAULT 1,material VARCHAR(60) NULL,lead_time_days SMALLINT NULL。
关键动作是给每个新字段指定维护人。如果没人负责填,字段加了也是空的,前台筛选反而更差。假设某企业把“交期”从备注拆成独立数字字段,但运营仍习惯写在备注里,那么两周后这个字段的空值率会很高,此时应暂停继续加字段,先改录入流程。
两种做法成立的条件不同。加列适合:新信息与现有记录是一对一关系,且大多数记录都有值。加关联表适合:新信息是一对多关系,比如一个产品有多个规格、多个价格区间、多个附件。
判断依据是“同一条记录会不会出现多个值”。如果会,加列就会导致重复行或被迫用分隔符拼接,后续查询会越来越难。此时应新建关联表,用主键关联,而不是在主表里继续堆列。
另一个取舍是历史数据怎么办。可选方案包括:全部留空、按默认值填充、或从旧备注中批量提取。批量提取只适合格式高度一致的旧数据;格式混乱时,强行提取会制造错误数据,此时留空并标记“待补”更稳妥。这个决定会影响下一步:如果选择留空,前台展示就要允许该字段为空,不能因为缺值而隐藏整条记录。
字段加完不等于可用。至少验证:
验证时用一条真实旧记录和一条新记录对照。如果旧记录在详情页缺字段时出现空白或错位,说明模板需要容错处理;如果新字段在列表页筛选无结果,先检查数据是否已回填,而不是先怀疑索引。
如果新增字段已经超过原有字段数量,且多个页面都要跟着改模板、改筛选、改导出,说明问题不在字段,而在最初的数据模型。此时继续加列的维护成本会超过一次重构。判断信号包括:同一信息在多个表里重复存储、字段命名含义重叠、每次加功能都要改三处以上代码。
这种情况下,合理动作是先冻结新增字段,用一周时间梳理实体关系,再决定是否迁移。迁移前保留旧表只读,新表写入,前台逐步切换。这个顺序能让你在出现问题时回退,而不是在数据被覆盖后才发现映射错误。扩展字段本身不难,难的是让新增的字段真正有人维护、有页面使用、有校验兜底,否则它只是数据库里多出的一列空值。