先给结论:如果新增字段只影响展示和筛选、旧数据可以留空,优先在原表加可空字段;如果新字段会改变业务含义、需要独立生命周期或一对多关系,就应该新建关联表,而不是继续往原表塞列。判断依据不是“改起来快不快”,而是旧记录在新规则下是否仍然成立。
上线一段时间后,业务方提出新需求,例如原来只记录客户姓名和电话,现在要区分咨询来源、跟进人和多次回访记录。开发第一反应往往是在原表加几列,页面照常显示,短期看不出问题。但几周后会出现两种矛盾:一是同一客户的多条回访被压进一列,用逗号拼接,查询和统计变得困难;二是旧数据没有新字段值,筛选时被误判为“未跟进”。
这时有两种解释。第一种是字段确实不够,属于模型缺列;第二种是关系没建对,属于模型缺表。两者表面都表现为“没地方存”,处理方式却完全不同。
区分的关键证据是旧数据在新规则下是否还有效。可以用一个假设例子说明:假设原表有一条客户记录,只有姓名和电话,没有来源字段。现在要增加“来源”字段,旧记录填“未知”即可,这不影响它作为一条客户记录存在,属于缺列。反过来,如果要记录同一客户的五次回访,每次回访有独立时间、内容和跟进人,旧记录无法用一列表达多次事件,这属于缺表。
可操作的判断步骤:
做完这一步,下一步不是立刻改数据库,而是先确认旧记录是否需要回填。若需要回填,应先定义回填规则,再决定表结构。
加可空字段适合以下条件同时成立:新字段只用于补充描述,不参与唯一性判断;旧记录留空不会导致业务误判;查询时能接受“空值等于未填写”而不是“空值等于否”。
实际动作示例:在客户表增加“来源”列,默认空值,页面展示时对空值显示“未标注”,而不是显示“无来源”。这个动作的结果是旧记录不被错误归类,新记录可以正常填写。下一步再决定是否对空值做批量回填,回填前需要业务方给出可核对的来源清单,不能由开发猜测。
代价也要写清楚:可空字段增多后,同一张表的语义会变杂。如果后续又出现“来源备注”“来源确认人”“来源确认时间”,它们仍然可以加列,但一旦需要记录来源变更历史,加列就不够了。
新建关联表适合新增信息是一对多关系,或需要独立记录创建时间、修改时间、状态的情况。例如回访记录表,每条回访关联一个客户,客户与回访是一对多。此时不应在原客户表加“回访1”“回访2”这类列。
迁移顺序建议:
这个顺序的结果是:新旧数据并行一段时间,便于发现遗漏;下一步的决策点在于旧字段是否还有页面依赖。若仍有依赖,就保留只读,不要直接删除。
假设某齐齐哈尔本地服务类网站,上线时预约表只有姓名、电话、预约时间。后来业务要求记录“每次沟通结果”。如果只在预约表加一列“沟通结果”,第二次沟通就会覆盖第一次,这是缺表。正确做法是新建沟通记录表,每次沟通一行。判断证据是:同一预约可能出现多条沟通记录,且每条有独立时间。若业务实际只保留最后一次沟通结果,且旧记录可以留空,那么加一列也能成立。两种选择的分界线是“是否需要保留多次历史”,而不是“哪种改起来省事”。
无论选哪种,改动前都应先在测试环境用真实旧数据跑一遍查询,确认空值和关联查询不会让旧记录从列表中消失。这个动作的结果会直接决定下一步是回填数据还是调整查询条件。