单一来源的正确做法不是禁止一篇文章出现在多个栏目,而是让内容实体只存一份、栏目只保存指向它的关系。假设有一个企业站,同一篇“设备保养周期说明”同时要出现在“服务支持”“资料下载”“行业知识”三个栏目里。如果为每个栏目各建一份正文,改一处就得记住改三处,漏改一次就会出现三个版本。下面用一个明确标为假设的情境,把决策过程写清楚。
维护单一来源之前,要先确认这几处展示的到底是不是同一份内容。判断依据可以看三点:正文主体是否逐字相同、更新责任是否落在同一个人或同一流程、读者是否需要看到完全一致的版本。三条都满足,才适合同一来源;只要有一条不满足,就应该拆成独立内容。
假设“服务支持”里是面向客户的保养步骤,“行业知识”里是面向同行的原理分析,两者虽然引用同一组数据,但受众和写法不同。这种情况下强行合并成一份,反而会让两边都读不顺。真正需要单一来源的,是那些正文完全一致、只是入口不同的内容。
这一步的实际动作是列出候选清单,逐条标注更新责任人和受众。标注完成后,如果发现某个栏目对应的受众明显不同,就先把它从合并范围里移出去,再处理剩下的部分。这个动作直接决定后面要维护几个来源,而不是先定方案再回头改内容。
确认是同一份内容后,结构上要做的是把“内容本身”和“它出现在哪些栏目”分成两层。内容层保存标题、正文、更新时间等字段,每个实体只有一个稳定标识;栏目层只保存这个标识和排序、置顶等展示信息。
用伪代码表示,关系大致是这样:
content: { id, title, body, updated_at }
section_item: { section_id, content_id, sort }
这样“服务支持”和“资料下载”两条栏目记录指向同一个 content_id,正文只存一份。修改正文时只动内容层,两个栏目自动看到同一版本。需要调整某个栏目的顺序时,只改对应的 section_item,不会波及正文。
选择这种结构的前提是站点已经有稳定的内容标识机制。如果现有系统只能按栏目存正文,无法建立跨栏目的引用关系,那就要先评估改造成本,而不是硬套。改造范围大的时候,可以先只对更新最频繁的那批内容建立引用,其余暂缓。
继续用前面的假设情境。运营把“设备保养周期说明”的标题从“保养周期说明”改成“设备保养周期与检查要点”,因为搜索词覆盖更广。如果三个栏目各存一份正文,这次改名需要改三处;漏掉“资料下载”那一处,读者从下载入口进来看到的还是旧标题,和另外两个入口对不上。
改成单一来源后,这次改名只动内容层一处。三个栏目因为都指向同一个标识,展示出来的标题同时更新。下一步要做的是检查栏目层有没有单独写死标题;如果某个栏目为了排版另存了一份标题文案,它就不会跟着变,需要单独处理或改为读取内容层字段。
这个假设说明的是:单一来源减少的是正文和核心字段的重复,不保证所有展示文案都自动同步。栏目层如果存在独立文案,仍要纳入维护清单。
样本少的时候,靠人工记住“这篇在三个栏目里”还能应付。内容量上来之后,例外会集中出现,常见的有以下几类:
这些例外不能靠“规定不许复制”解决,要靠可检查的机制。实际动作是定期跑一次比对:按正文摘要或标题分组,找出内容高度相似但标识不同的记录。比对结果出来后,先判断哪些是应该合并的重复,哪些是确实需要保留的变体;前者合并回单一来源,后者在内容层标注清楚用途,避免下次又被当成重复处理。
需要说明的是,比对发现大量相似记录,只能说明存在重复的可能,不能直接证明结构设计有问题。旧站迁移、多语言版本、面向不同渠道的改写,都会产生相似但不该合并的内容。判断依据仍然是更新责任和受众是否一致。
单一来源最容易在迁移或改版时被破坏,因为导入工具通常按栏目组织数据,一个内容出现在几个栏目就会被写成几条记录。降低这种风险的做法是:迁移前先导出内容层和栏目关系两份数据,迁移后按内容标识核对栏目关系的数量,而不是按栏目分别核对条目数。
如果发现某个内容标识对应的栏目关系数量比迁移前少,说明有入口丢了;如果正文记录数量比迁移前多,说明产生了重复实体。这两种情况的处理方向相反,先分清再动手,不要一律按“多出来就删”处理。
适用条件也要说清楚:这套做法适合内容需要跨栏目复用、且更新较频繁的站点。如果站点内容基本只归属一个栏目、几乎不跨栏目展示,维护单一来源的额外结构可能得不偿失,按栏目直接存放反而更简单。选择哪种,取决于跨栏目复用是不是常态,而不是哪种听起来更规范。