字段不够用,先别急着改表结构。更稳妥的顺序是:判断新信息能不能用现有字段表达,再决定保留、改写还是退出。保留指把新数据塞进已有字段或关联表;改写指在保持旧数据可读的前提下增补字段;退出指把这类数据迁到独立模块或外部服务。三种做法对应的前提不同,选错会让后续查询、表单和接口一起变复杂。
多个角色说“字段不够”,往往指的不是同一件事。运营可能想要一个多选标签,开发看到的是需要新增关联表;客服想要记录每次沟通结果,实际需要的是带时间戳的记录,而不是主表里再加一列。把分歧转成可核对的项目,可以先做一次字段盘点:列出当前每个字段的用途、谁写入、谁读取、是否允许为空、是否参与筛选或统计。
盘点后通常会出现三类证据。第一类是同名字段被不同角色按不同含义使用,比如“状态”在运营眼里是内容进度,在开发眼里是发布开关。第二类是多个值挤进一个字段,用逗号或竖线分隔,导致无法单独筛选。第三类是信息本身有生命周期,比如一条记录需要保留多次变更,而当前只有最终值。第一类适合改写,第二类适合退出到关联结构,第三类往往需要新增子表或事件记录。
保留不是“先凑合用”,而是确认新信息与旧字段的取值域、长度和含义都兼容。假设一个移动网站的商品表已有“备注”字段,现在要记录“是否支持货到付款”。如果备注只用于内部说明,且没有筛选需求,把标记写进备注可以暂时保留。但一旦需要在列表页按该条件过滤,或需要统计比例,保留就会失效,因为备注是自由文本,无法稳定比较。
判断保留是否成立,可以问三个问题:新信息是否只有一个值、是否不需要单独排序或筛选、是否不会与旧内容冲突。三个都满足,保留的成本最低。只要有一个不满足,就应进入改写或退出,而不是继续往同一个字段里追加内容。
改写适用于新信息与现有记录一一对应、且每条记录最多一个值的情况。比如用户表原来只有“手机号”,现在要区分“手机号”和“备用联系方式”。这时可以新增字段,但必须先决定旧记录在新字段里显示什么。常见选择是留空、写入与旧字段相同的值,或写入一个明确的“未采集”标记。
这个动作会直接影响下一步。如果选择留空,前端展示和接口返回都要能处理空值,否则列表页可能出现空白列;如果选择复制旧值,后续无法区分“用户确实填了两个相同号码”和“系统自动复制”;如果写入“未采集”,统计时又要把这个标记排除。建议先在一个只读页面上验证展示效果,再决定是否让新字段参与筛选。改写完成后,旧字段是否保留取决于它是否还有独立含义:若新字段完全覆盖旧字段,可以保留旧字段只读一段时间,确认没有调用方依赖后再考虑退出。
退出适用于一对多、多对多或需要保留历史的情况。例如一个移动网站原来在订单表里用“配送备注”记录每次沟通,现在要记录多次配送变更。继续加字段会不断膨胀,合理做法是新增配送记录表,每次变更写一条记录,订单表只保留当前状态。
退出的前提是能接受查询变复杂。原来查一张表就能拿到的信息,现在需要关联或二次请求。如果列表页要显示最新一条配送记录,接口需要明确取哪一条、按什么排序。若没有稳定排序规则,同一订单可能每次返回不同结果。另一个前提是写入方要改:原来只更新订单表,现在要同时写记录表,还要处理写入失败时的回滚或补偿。退出不是纯技术迁移,它会把字段设计问题转成流程问题。
无论选保留、改写还是退出,都建议先产出一份字段清单,而不是直接改代码。清单至少包含:字段名、业务含义、写入角色、读取角色、是否必填、是否参与筛选、旧数据如何处理。让运营、客服和开发分别确认同一行,分歧会具体到某个字段的某个属性,而不是停留在“字段不够”。
假设一个移动网站要在用户表增加“意向等级”。运营认为这是单选,客服认为可以多选,开发认为需要记录变更历史。三种理解对应三种做法:单选可改写,多选要退出到关联表,记录历史要退出到事件表。先让三方在清单上确认“一条用户记录同时有几个意向等级”和“是否需要知道等级何时变化”,再决定动作。确认后如果发现需要历史,就不要用改写硬撑,否则后续每次调整等级都会覆盖旧值,无法还原。
扩展字段没有唯一正确答案,但有可验证的取舍顺序:先确认信息能否被旧字段无损容纳,再确认是否一一对应,最后确认是否一对多或需要历史。每一步都用一个具体动作验证,而不是靠角色之间互相说服。