先判断一件事:新增字段是“补信息”还是“改结构”。如果只是给已有记录补充说明,通常可以直接加字段;如果新需求要改变一条记录与其它记录的关系,比如一个客户对应多个联系人、一个订单对应多次交付,那就需要先改数据模型再谈加字段,否则后面会反复返工。
条件一:新信息与原有记录是一对一关系,且旧数据可以留空。例如原先只存了“客户电话”,现在想再存“客户微信”。这种情况扩展成本最低,加一个可空字段即可,历史记录该字段为空不影响原有页面读取。
条件二:新信息与原有记录是一对多关系,或者旧数据必须补全才能用。例如原先一条报名记录只存一个参与人,现在要支持同一单位多人报名;又或者新增字段要参与筛选、统计、导出。这时如果硬塞进原表,会出现重复行、统计口径混乱、导出对不齐等问题,应该新建关联表,而不是在主表上继续堆字段。
判断依据可以落到一个动作上:把新需求写成一句“谁,在什么页面,要看到或操作什么”。如果这句话里出现“多个”“每次”“按……汇总”,基本就属于条件二。这个动作的结果会直接决定下一步是写一条加字段语句,还是先画一张关系图。
多角色对同一事实理解不同,往往不是技术问题,而是“字段含义”没对齐。运营说的“状态”可能指客户跟进阶段,技术理解的“状态”可能是记录是否启用。扩展前把分歧转成可核对的清单,比直接改表更省事。
这份清单的作用是让分歧变成可勾选的项目。如果某个字段连负责人都定不下来,说明它还不该进入数据库,先放一放比先加上再改更稳妥。
假设一个荆州本地服务类网站,上线时预约表只有“姓名、电话、预约时间”三个字段。上线后业务方提出:同一个电话可能给多位家人预约,还要记录每位家人的服务项目。此时如果继续在原表加“家人2姓名、家人2项目”这类字段,查询和统计都会变得别扭。
更合理的做法是保留原预约主表,新建一张“预约明细”表,用预约编号关联。主表存联系人和整体状态,明细表存每位家人的姓名与服务项目。这样新增第三位家人时不需要再改表结构,只需要多插一行明细。
这个例子的假设前提是:业务方确认“一个电话对应多人”是常态,而不是偶发。如果只是极少数情况,也可以先用备注字段过渡,等确认高频出现再拆表。两种选择都成立,区别在于你对未来数据形态的判断。
确定要加字段后,按下面顺序执行,能减少对线上页面的影响:
这里有一个常被忽略的例外:如果新字段要参与搜索或排序,仅加列还不够,还要确认查询语句、缓存和导出模板同步更新。只改数据库而忘了改读取逻辑,会出现“字段加了但页面看不到”的情况,这时应回头检查读取层,而不是继续加字段。
另一个例外是历史数据补全。若新字段被设为必填,旧记录会全部不满足约束,导致保存失败。此时要么允许为空并逐步补录,要么先批量写入一个明确的默认值,再在页面上提示待完善。选择哪种,取决于这个字段是否影响对外展示。
每次扩展字段,都应该在项目里留下一份字段说明,写清楚新增时间、用途、是否可空、由谁维护。这样下次再遇到“这个字段能不能改”的问题时,不必靠回忆。字段设计不够用并不可怕,可怕的是每次扩展都靠临时记忆,最后没人说得清哪个字段才是准的。