把内容只存一份、给多个栏目分配“引用关系”,而不是在每个栏目各存一份副本,是维护单一来源的核心做法。这样做的直接结果不是页面变少,而是改一次、所有入口同步变化。但有一个反直觉之处:单一来源并不等于所有栏目共用同一个列表页,它要求先区分“归属栏目”和“展示栏目”,否则引用关系会越理越乱。
假设一个情境:某企业站要发布一条“设备检修停运通知”,它既属于“新闻动态”,又要在“客户服务”栏目里被看到。如果两个栏目各建一篇内容,后续停运时间改了,编辑只改了其中一篇,另一个入口就会留下过期信息。这不是编辑粗心,而是结构本身允许了双份数据。
可区分的原因大致有三类:一是内容被复制成两份独立记录;二是同一记录被两个栏目分别拉取,但标签或排序规则不同;三是栏目页只是聚合视图,实际仍指向同一详情地址。只有前两类会制造不一致,第三类才是真正的单一来源。判断方法很朴素:改一次标题里的一个词,刷新两个入口,若只有一处变化,就是复制;若两处都变,才是引用。
实际操作上,可以把内容模型拆成“内容主体”和“栏目挂载”两层。内容主体保存标题、正文、发布状态和唯一标识;栏目挂载只记录“哪个栏目引用哪个标识、排序值是多少”。发布时,栏目页根据挂载关系去取内容主体,而不是自己保存一份正文。
这个动作会直接影响下一步:一旦挂载层和主体层分离,编辑就不需要在两个栏目里各改一遍,改主体的标题或正文即可同步;反过来,如果某个栏目需要不一样的摘要或配图,就应该在挂载层增加“栏目专属摘要”字段,而不是把整篇内容复制过去。这样既保留了单一来源,又允许入口有差异。
需要说明的是,采用某种 CMS 或框架本身并不会自动带来更好的搜索表现,它只决定数据是否容易保持一致。选择哪种实现,取决于团队能否维护这套引用关系。
继续上面的假设。停运通知原定三天,后来延长到五天。若采用单一来源,编辑只改主体的时间字段,两个栏目入口都会显示新时间;若采用复制,编辑需要找到两篇内容分别修改,且很容易只改一篇。
这里有一个容易误判的地方:有人会看到某个栏目页没有立即变化,就断定单一来源失效。其实更合理的解释可能是缓存未刷新、栏目页按固定时间重新生成,或者挂载关系里排序靠后。请求量或抓取量暂时归零,也不能单独证明结构处理正确,它同样可能来自抓取节奏、入口链接变化或页面本身的可访问性问题。要区分这些解释,最可靠的动作是直接打开两个入口对照同一字段,而不是看统计曲线。
单一来源不是唯一成立的选择。以下条件同时满足时,多份副本反而更省事:内容很短、几乎不会更新;两个栏目面向的读者需要完全不同的措辞;团队没有能力维护挂载关系,且更新频率极低。
反过来,如果内容会反复修订、涉及时间或价格等易变字段、或者同一主题需要出现在三个以上入口,就应该优先做单一来源。判断依据不是栏目数量,而是“同一字段被修改的次数”和“修改后需要同步的位置数”。
无论用哪种方式,都要先给每条内容一个不会随栏目变化的唯一标识,例如稳定的编号或固定别名,并明确谁负责修改主体。这个动作的结果是:编辑改的是内容本身,栏目只是入口;当某个入口显示异常时,排查方向从“这篇是不是被改坏了”变成“挂载关系或缓存是否正常”。
如果团队暂时无法改造结构,退一步的做法是:指定一个栏目为“主副本”,其他栏目只放指向主副本的链接,并在编辑规范里写明更新只改主副本。这不能完全消除不一致,但能把需要同步的位置从多个压缩到一个,比在两个栏目里各改一遍更可控。