先给结论:字段不够用通常不是“再加一列”就能收尾,而要先判断它属于展示层缺口还是结构层缺口。前者可以靠派生字段、视图或前端映射补齐;后者必须走一次可控的迁移,并且迁移前先确认旧数据能回填、写入路径能双写或回滚。缺少完整数据和数据库权限时,最小动作是导出样本、列出字段清单和依赖关系,而不是直接改线上表。
上线后才暴露字段不足,常见有两种解释,处理成本差别很大。
第一种是展示层缺口:底层其实存得下,只是当初没有把某个属性单独建列,或者它被塞进了备注、JSON、标签串里。此时新增一个查询映射、视图或导出模板就能满足需求,不必动主表。
第二种是结构层缺口:当前模型把“一个对象只有一个值”写死了,而业务已经变成“一个对象有多个值、多个时间点或多个来源”。例如原来只存一个联系电话,现在要区分咨询电话、售后电话和紧急联系人;原来只存一个状态,现在要保留状态变更历史。这类情况加列只能缓解一时,后续还会继续撞墙。
还有一种容易被误判的情况:字段其实存在,但权限、接口或同步链路没有把它带出来。表现和“字段不够”一样,实际不需要改表结构。
不要凭感觉判断,先收集四类证据。
如果样本里目标信息已经存在、写入路径也完整,只是没有暴露出来,那更接近展示层缺口;如果样本里根本没有这个信息,或者它天然是一对多关系,那更接近结构层缺口。
没有生产库写权限、也拿不到全量数据时,仍然可以做一件有价值的事:整理字段影响清单。动作包括列出新增字段的名称、类型、是否必填、默认值、唯一性要求,以及它会被哪些页面、接口、报表和导出使用。做完这份清单后,下一步不是立刻申请改表,而是拿它去和负责数据或后端的人确认写入来源和迁移窗口。清单越具体,越能减少“改了表但没人写值”的返工。
这里要说明一个边界:导出样本、统计现有记录里某字段的空值比例,只能说明当前这批数据的状态,不能证明新字段上线后一定被正确写入,也不能证明旧数据可以无损回填。样本为空值,可能是业务本来就不采集,也可能是采集了但没同步过来,这两种原因需要分别核实。
假设一个预约类站点,最初只存“预约时间”一个字段。上线后发现同一客户可能改期多次,需要保留每次变更。此时有两种做法:
判断哪种成立,看的是“未来会不会继续追加”和“是否需要保留顺序”,不是看当前有多少条数据。若只是临时导出用,视图或导出模板可能就够了;若要长期支撑查询和统计,关联表更合适。
无论选哪种方案,都建议先定义回退条件。可加列时,先加可空列并保留旧读写逻辑,观察一段时间再切换;需要拆表时,先双写一段时间,确认新表数据完整后再切换读取。回退条件可以写成:新字段空值率异常、写入报错增加、或关键报表结果与旧逻辑不一致时,暂停切换并回到旧路径。
需要提醒的是,抓取量、请求量或某张报表数字暂时归零,不能单独证明迁移失败。它也可能是缓存未刷新、定时任务还没跑、或查询条件变化导致的。要结合写入日志和样本抽查一起看,才能判断问题出在结构、同步还是展示层。
字段扩展的下一步,不是马上改线上表,而是先拿到字段影响清单和写入来源确认,再决定加列、建关联表,还是只补一层视图。