先判断字段缺口是“表达层不够”还是“结构层不够”:前者加派生展示或独立扩展表就能解决,后者必须做数据迁移。判断依据是同一实体的新信息是否会被多个页面、多个查询条件同时使用,以及它是否需要参与筛选、排序或统计。若答案是需要,就应该进入结构层改造,而不是继续往备注字段里塞内容。
假设一个酒泉本地建材站点上线时,产品表只设计了名称、规格、价格、图片和一段描述。运营两个月后,业务方希望每个产品能标注适用工程类型、供货周期、可配送区域,并且前台要能按工程类型筛选、按供货周期排序。此时有两种做法。
第一种是在原产品表增加几个文本字段,把三项信息都写进去。上线快,改动小,适合信息只用于详情页展示、不参与筛选排序的场景。代价是同一工程类型会被写成多种说法,筛选只能做模糊匹配,后续统计口径很难统一。
第二种是新建工程类型表、配送区域表,再用关联表把产品和它们连起来。改动涉及建表、回填历史数据、改写入逻辑和前台查询。适合新信息要参与筛选、排序、聚合,或被多个栏目共用的场景。代价是上线周期更长,迁移期间要保证新旧数据一致。
扩展前先回答三个问题,答案会直接指向路线。
如果三个问题里有两个以上指向“关系”或“查询”,就不要再走加文本字段的省事路线。反过来,如果只是详情页多一段说明、永远不参与筛选,加字段反而更划算。
以假设情境为例,选择结构层路线后可以按这个顺序推进。先建工程类型字典表和配送区域字典表,各自只放标识与名称。再建产品与工程类型的关联表、产品与配送区域的关联表,关联表上对产品标识建索引。然后写一次性回填脚本,把旧描述里能识别的信息拆出来写入关联表,识别不了的单独列出人工确认。
回填完成后不要立刻删旧字段,先让前台同时读新旧两套数据,比对同一产品在列表页和详情页的展示是否一致。确认一致后,再把筛选和排序切到新表,最后才清理旧字段。这个顺序的价值在于:任何一步出问题都能退回上一状态,而不是一次性改完再排查。
如果选择加字段路线,动作则是:统一新字段的取值规范,写入前做格式校验,筛选时接受模糊匹配的误差,并在后台说明这些字段不用于统计报表。这样做的结果是短期可用,但每增加一个筛选维度都要重新评估是否推倒重来。
第一是写入逻辑。前台表单、后台编辑、批量导入可能各自写一套数据,扩展后要确保三处都写新表,否则会出现前台能筛选、后台改完却丢失关联的情况。第二是空值语义。旧数据回填后,没有对应关系的产品在筛选时应该被排除还是归入“未标注”,这会影响筛选结果的完整性,需要提前定好。第三是查询性能。关联查询变多后,列表页的响应可能变慢,应先用真实数据量做一次查询验证,再决定是否加缓存或调整查询方式。
需要说明的是,抓取量或访问量短期波动不能单独证明扩展做对了或做错了。模板改动、URL 变化、抓取预算重新分配都可能造成类似现象,判断依据仍应回到数据一致性和查询结果是否符合预期。
回到最初的问题:上线后发现字段不够用,先分清信息是“展示型”还是“关系型”。展示型加字段,关系型建表并回填;要参与筛选排序的,一律按关系型处理。迁移时保留旧字段做对照,先双读再切换,最后清理。这样扩展的代价可控,也不会因为一次省事而把后续每次加维度都变成返工。