先接受一个事实:字段不够用通常不是“再加一列”那么简单,而是当初的字段模型把多种含义压在同一个位置上。可行的扩展路径有两条——在原表上追加可空字段,或拆出独立扩展表;选哪条,取决于旧数据能否批量映射、以及各角色对同一字段含义是否还有分歧。下面用你手里已有的字段清单和一张样例记录,把分歧变成可核对的项目。
上线后暴露的字段问题,往往表现为几种说法:运营说“少一个备注”,开发说“备注字段已经有了”,客服说“我填的内容别人看不到”。这些说法指向的对象可能完全不同。判断方法很直接:取三条真实记录,让每个角色分别指出自己填过的值落在哪一列。如果同一列被不同角色填入了不同性质的内容,这是结构问题;如果大家指向同一列、只是叫法不同,那是命名问题,改标签和文档即可。
结构问题的证据通常有三类:一列里出现两种以上格式(例如既有日期又有自由文本);某列长期为空但业务上确实需要该信息;多个角色对同一列是否必填、由谁维护给出相反答案。只要出现其中一类,就应该停止在界面层加输入框,转而回到字段模型处理。
不要从“还缺什么”开始,而从“现在有什么”开始。打开后台编辑页和对应的数据表结构,逐字段记录四项内容:字段名、实际存放的值举例、填写角色、读取角色。这里的关键是“实际存放的值”,不是字段注释。假设有一个名为 remark 的字段,运营用它记录客户偏好,客服用它记录沟通结论,那么它的实际语义已经分裂,任何新增需求都会继续往这里堆。
完成对照表后,把每个字段归入三类:稳定标识(如编号、创建时间)、业务事实(如金额、状态)、自由描述(如备注)。扩展时优先处理自由描述类,因为它们的语义最容易漂移。稳定标识类不要动,业务事实类新增前先确认是否已有字段可承载。
适用条件是旧记录不需要该值也能正常展示,且新字段与原有字段没有一对多关系。动作是新增列并允许为空,写入逻辑只在新流程中生效。结果判断标准:旧记录读取时不受影响,新记录能完整保存。如果发现新值需要按时间保留多条历史,说明它其实是一对多,应转向路径二。
适用条件是同一对象需要多条同类信息,或不同角色维护的信息需要分别审计。动作是建立以对象标识关联的子表,原表只保留主记录。代价是查询和展示需要关联,前端要处理“无扩展记录”的情况。判断是否值得:如果新需求未来还会继续增加同类条目,拆表比反复加列更省事;如果只是补一两个偶尔填写的值,加列更直接。
假设某项目上线后发现“客户来源”只有一个文本字段,但市场部想记录渠道、活动名称和落地页,销售部想记录转介绍人。取三条记录核对:同一字段里确实混有渠道名和姓名。此时加一个“来源类型”字段无法解决,因为渠道、活动、转介绍人是并列的多种来源,且未来可能继续增加。按路径二拆出来源明细表,原字段保留为兼容旧数据的只读展示。迁移时只对能明确归类的旧值写入新表,无法归类的留在原字段并标记待人工确认。这个动作的结果是:新数据可以按类型统计,旧数据不会丢失,但报表需要同时读两处,直到人工确认完成。下一步才是清理原字段,而不是立刻删除。
如果扩展涉及对外接口,先确认调用方是否依赖原有字段顺序或整体结构;字段增加通常兼容,字段改名或删除则可能破坏调用。无法确认调用方时,保留旧字段并新增字段,比直接替换更稳妥。
如果核对后发现同一对象的字段在不同表里重复出现、且值不一致,或者每次新增需求都要改动多个页面和接口,那么继续打补丁的成本会持续上升。此时值得暂停新功能,先统一字段定义和归属。判断依据不是“代码好不好看”,而是同一事实是否只有一个写入位置。做不到这一点,后续每次扩展都会重复今天的分歧。
扩展字段本身不难,难的是让所有角色对同一个字段的含义达成一致,并让旧数据有明确的去向。