先别急着改数据库。把当前页面上的一个真实资料对象找出来,例如一条线路产品、一间客房或一篇游记,逐项写出它现在有哪些字段、哪些字段是写死的、哪些内容被塞进了备注或正文。多数“字段不够用”不是缺字段,而是字段被当成了分类标签,一旦出现新维度就无处安放。判断能否扩展,看的是这个对象未来会不会出现同一类信息的多个取值。
如果新增的信息对每条记录只取一个值,例如上线后要给每条线路补一个“集合地点”,直接加一个字段即可,改动小、风险低。如果新增信息对同一条记录可能有多个值,例如一条线路有多个出发日期、多个价格档位、多个联系人,继续加字段就会不断出现“日期2”“价格3”这类列,越加越乱。
可区分的证据是:把现有数据导出看一眼,某列里是否已经出现用逗号、斜杠或换行分隔的多个值。如果有,说明这个维度天生是一对多,应该拆成独立的关联表,用记录编号关联,而不是继续横向加列。假设一条张家界三日游线路原本只有一个“出发日期”字段,后来需要支持每周多个班期,那么正确做法是新建班期表,每行一个日期,而不是在原表加“日期二”“日期三”。这一步判断决定了后面所有改动的工作量。
打开后台里最复杂的那条记录,对照前台页面从上到下走一遍,把每个可见信息块标出来,并注明它来自哪个字段。常见遗漏是那些“临时放在正文里”的结构化信息:价格写在段落里、注意事项混在描述里、交通方式靠编辑手动排版。这些内容前台能看,但后台无法筛选、无法批量更新、无法按条件调用。
把这些内容单独列成待扩展清单,每一项后面写清三件事:这条记录是否只有一个取值、是否需要被搜索或排序、是否会被其他页面复用。三项都答“否”的,可以留在正文不动;只要有一项答“是”,就值得转为独立字段。动作的结果会直接影响下一步:清单越具体,后面加字段或建表时越不容易漏掉关联关系。
已经上线的站点不能停机重来,所以扩展要分两步。第一步只新增,不删除、不改名。新字段默认允许为空,旧数据保持原样,前台暂时继续读旧字段。第二步写一段转换逻辑,把旧字段里能解析出的内容填充到新结构,解析不了的先保留原值并标记出来。这样做的结果是新旧数据并存,页面不会因为字段缺失而空白。
需要提醒的是,转换后前台显示正常,并不等于数据已经整理干净。抓取量或访问量没有立刻变化,也不能单独证明这次扩展做对了,因为那还可能受缓存、抓取周期、内容更新频率等因素影响。真正该看的是后台能否按新字段筛选出完整记录,以及前台在缺少新字段时是否有合理的兜底显示。
假设某条张家界线路原来用一个“价格”字段存成人价,上线后发现需要区分成人、儿童和单房差。可执行的顺序是:先加三个可空字段,保留原“价格”字段;再把原值写入成人价;然后前台优先读新字段,读不到时回退到原字段;最后人工补齐儿童价和单房差。这个顺序让每一步都可回退,不会因为一次改动导致价格显示为空。
三处里最容易漏的是输出模板。字段加好了、后台填好了,但前台模板仍读旧字段,就会出现“后台有数据、页面不显示”的假象,让人误以为扩展失败。核对时直接改一条测试记录,看前台是否立即反映,就能定位问题在数据还是模板。
如果待扩展清单里超过一半的项都是一对多关系,或者同一条记录已经出现三种以上用分隔符拼接的多值字段,继续打补丁的维护成本会高于重建。此时更合理的动作是把数据模型整体梳理一遍,明确哪些是主体、哪些是附属、哪些是分类,再决定迁移顺序。判断依据不是字段数量,而是新增一个业务维度时,需要改动几处、是否要动前台模板、是否要重新导入历史数据。改动面越小,说明当前结构越能撑住后续扩展。