扩展字段前先别急着改表。更稳妥的顺序是:确认缺失字段属于哪一类数据,判断它能不能从现有字段推导,再决定是新增独立字段、拆出关联表,还是只改展示层。判断错了,后面每加一个字段都会带来新的重复和迁移成本。
假设一个外贸站最初只做询盘表单,字段是姓名、邮箱、公司、留言。几十条数据时,运营在后台直接看就够了。当产品线扩展到多个品类、每个询盘要记录目标市场、报价币种、样品阶段、跟进人时,原来的单表结构开始出现两种典型问题。
此时“字段不够用”往往不是字段数量问题,而是数据关系没有被拆开。
解释一:只是展示维度不够。数据本身已经存在,只是后台列表没有显示,或者导出时没有带上。例如询盘来源可以从落地页 URL 推导,不必新增字段。这种情况下扩展成本低,改查询和界面即可。
解释二:实体关系没有拆开。一个客户对应多次询盘、多个报价、多个跟进记录。如果全塞在一张表里,新增字段只能缓解一时,无法解决一对多关系。这时应该拆出客户表、询盘表、报价表,用客户 ID 关联。
两种解释对应完全不同的动作。前者改展示,后者改结构。混淆的代价是:明明该拆表,却不断加列,最后字段名越来越长,数据仍然对不上。
可以按下面几条逐一核对,不需要一次全做,但每条都能缩小范围。
这些证据指向的是结构判断,不是“字段越多越好”。新增字段本身不解决关系问题,只解决可检索性问题。
假设某外贸站询盘表已有字段:id、name、email、company、message、created_at。现在要记录每个询盘的跟进状态和报价币种。可以这样分步处理,每一步都注明假设。
status 字段,枚举值为新建、已联系、已报价、已关闭。这一步只解决当前状态,不保留变更历史。quotes 表,字段为 id、inquiry_id、currency、amount、quoted_at。用 inquiry_id 关联,而不是在询盘表里加 quote1、quote2。customers 表,用 email 或客户编号关联,避免公司名拼写不一致导致重复。执行第一步后,如果运营反馈“想看谁改过状态”,说明当前字段不够,需要加变更日志表,而不是继续加状态列。这个反馈就是下一步动作的依据。
不是所有站点都需要拆表。如果询盘量小、只有一个人跟进、没有报价历史,单表加几个字段更省事。反过来,如果已经出现同一客户多次询盘、多人协作、需要按市场或币种统计,拆表带来的查询复杂度是值得的。
另外,扩展字段要考虑旧数据怎么填。新增字段如果设为必填,旧记录会缺值;如果设为可空,查询时要处理空值。这个取舍取决于旧数据是否还要参与筛选。可以先加可空字段,回填后再决定是否收紧约束。
最后,改结构前先备份,并在测试环境验证查询和导出是否仍然正常。备份和验证不是形式,它们决定扩展后能不能回退。扩展字段的动作本身不保证数据质量,它只是让后续的筛选、统计和跟进有可依赖的结构。