先给结论:如果数据库里已有真实数据,不要直接删表重建,也不要指望在后台随便加一个字段就完事。可行路径是“加新字段或新关联表,保留旧字段,分批迁移,读写双轨过渡”。下面以一个假设的内容站为例,说明怎么把手里已有的表结构和页面需求,变成一份可执行的扩展方案。
拿到问题页面后,先做一件事:把页面上要展示的信息逐条列出来,再对照现有数据表,标出每条信息来自哪个字段。列完之后通常会出现三种情况。
判断依据很简单:如果一条记录对应多个值,就不要再往主表加列。这一步做错,后面每加一个需求都要改一次表结构。
假设你手里有一张 products 表,字段是 id、name、price,现在页面要展示“不同规格不同价格”。不要先动生产库,先在测试库里做三步。
product_variants 表,字段至少包含 id、product_id、spec_name、price。price 当作默认规格,写一条迁移脚本,为每个产品生成一条规格记录。这个动作的结果会直接决定下一步:如果回退逻辑跑通,说明可以灰度上线;如果发现旧数据里有大量空价格或异常值,就要先补数据字典,再谈迁移。注意,测试库跑通不等于生产库没问题,生产库还要看数据量和写入频率。
字段扩展最容易出问题的地方不是加字段,而是切换瞬间。稳妥做法是让新旧结构并行一段时间:写入时同时写旧字段和新表,读取时优先读新表、失败回退旧字段。等新表数据完整、页面验证通过后,再逐步去掉旧字段的读取依赖。
这里有一个容易忽略的前提:双轨期间必须有办法判断哪边数据是准的。可以加一个来源标记字段,或者每天跑一次对账脚本,比较新旧两边的记录数和关键值。如果对账长期有差异,说明迁移脚本有漏,不能进入下一步。
字段加完不等于结束。至少还要处理以下三项,否则问题会以另一种形式回来。
还需要说明一个边界:如果当前连数据库的写权限都没有,只能读,那么能做的只是把需求整理成字段清单和迁移脚本草案,交给有权限的人评审。这种情况下不能得出“结构已经改好”的结论,只能得出“方案已具备执行条件”。
如果出现下面这些信号,继续加字段的代价会超过重建:同一张表已经加了大量可空字段、大量业务逻辑靠字段是否有值来判断、多个页面各自用不同方式解释同一字段。这时更合理的做法是冻结旧表写入,新建结构,用脚本一次性迁移,再让页面切到新结构。重建的前提是你能完整导出旧数据并验证迁移结果,否则风险比继续扩展更高。
回到最初的问题:上线后发现字段不够用,不是灾难,但处理顺序不能反。先分清缺字段、缺关系还是缺版本,再用一份真实数据在测试库验证,最后读写双轨过渡。每一步的结果决定下一步能不能走,而不是一次性把表改完就结束。