核心做法是让内容只在数据库中存一份,用“主栏目 + 关联关系”决定它出现在哪些列表里,而不是在每个栏目下各复制一份。若栏目数量少、更新频率低,手工同步尚可接受;一旦同一内容需要进入三个以上栏目、或更新频率高于每周一次,就必须改为单一来源加引用,否则改一处漏三处只是时间问题。
两种条件的分界线不是栏目多少,而是“同一内容被改动的次数”和“它需要出现在几个位置”。
判断依据可以看一个信号:如果你在修改某条内容时,需要先想“它到底在几个地方出现过”,说明已经进入条件二。
实施动作上,把内容表与栏目关系表分开。内容表保存标题、正文、发布时间等唯一字段;栏目关系表只保存内容 ID 与栏目 ID 的对应关系,一个内容可以对应多行,但内容本身只有一行。
列表页渲染时,从关系表查出当前栏目对应的内容 ID,再回到内容表取数据。这样修改标题只改内容表一处,所有引用它的栏目列表同步变化。作为假设例子:某条内容同时挂在“行业动态”和“首页推荐”,若标题写在内容表,改一次两处都变;若标题被复制进两个栏目配置,就要改两次,漏一次就出现两个不同标题。
这一步的结果会直接影响下一步:结构改对之后,才值得去处理排序、置顶、过期下线这些栏目级差异;结构没改对就先去调排序,只会把不一致藏得更深。
同一内容进入不同栏目时,往往需要不同的排序权重、不同的推荐语、不同的展示时段。这些差异属于“这个栏目怎么看这条内容”,应记录在关系表上,而不是塞回内容表。
这样做的取舍是:内容表保持干净,关系表承担栏目个性。代价是查询时需要多一次关联,但换来的是修改入口唯一。若把推荐语写进内容表,同一内容在两个栏目就只能显示同一句话,想区分就得复制内容,又回到多来源问题。
例外情况:如果某个栏目的展示文案与内容本身强绑定、且永远不需要在别处复用,可以允许它作为该栏目的独立字段存在,但要明确它不属于内容主体,避免被误当成第二来源。
小样本下成立的做法,放大后常在这几处失效:
这些例外的共同点是:它们都涉及“同一内容在不同栏目下的不同状态”,因此解决位置始终是关系层,而不是再复制一份内容。
日常维护只需盯一个指标:同一内容是否存在两条以上独立可编辑的记录。发现一条就合并一条。不要用“栏目里看起来正常”来判断,因为列表页正常不代表详情页和另一栏目也同步。
当内容需要进入新栏目时,动作是新增一条关联,而不是复制内容。这个动作的结果是:后续任何修改仍然只有一个入口,新增栏目不会带来新的同步负担。若某次更新不得不同时改多个地方,说明单一来源已经被破坏,应先修复结构再继续加内容。