先把“页数”和“对象数”拆成两个字段分别记录,再用对象主键去重,而不是先删页。报告页数多于实际对象,通常是因为一个对象对应多个页面(分页、参数页、重复模板页),或旧系统给同一对象生成了多条记录。去重的目标是让每个仍然要保留的对象只留一条可执行记录,同时把准备退出的旧内容、旧系统或旧合作关系单独标记,而不是直接删除。
打开报告,抽 10 到 20 行,逐行回答两个问题:这一行代表的对象是什么?它是否和另一行指向同一个对象?如果同一个对象出现在多个页面里,差异在页数一侧;如果同一页里混着多个对象,差异在对象一侧。两种情况的处理顺序不同:前者按对象合并页面,后者按对象拆分页面再合并。
可区分的证据有三类。第一,同一对象在报告里出现多次,但标题、URL 参数或模板结构不同,说明是页面层重复。第二,对象编号相同、名称略有差异,说明是记录层重复,需要先统一命名再判断。第三,页数正常但对象数偏少,说明部分对象被折叠进同一页,属于聚合口径问题,不是重复。
去重前先确定主键。常见主键包括对象编号、规范名称加所属系统、或外部合作方给出的唯一标识。主键一旦选定,同一主键下的多条记录只能保留一条。保留规则建议按以下顺序判断:
这里有一个容易踩的坑:把“页面数减少”当成去重成功。页面数下降可能只是分页被合并,对象重复仍然存在。判断去重是否有效,要看同一主键下是否只剩一条待执行记录。
假设某份报告显示 240 个页面、180 个对象。抽查后发现,其中 40 个页面是同一批对象的翻页,另有 20 个对象各出现两次。处理动作是:先把 40 个翻页合并到对应对象,页面数降到 200;再把 20 个重复对象按主键各保留一条,对象数从 180 降到 160。此时页面数与对象数仍不相等,因为一个对象可能对应多个必要页面,这是正常状态,不需要继续硬删。
这个动作的结果会直接影响下一步:如果合并后对象数明显下降,说明重复主要来自记录层,接下来应检查数据导入或同步环节;如果对象数基本不变、页面数下降,说明重复主要来自页面层,接下来应检查模板和分页规则。两种结论对应不同的修复位置,不能混在一起改。
旧内容、旧系统或旧合作关系需要退出时,最稳妥的做法是建一张退出清单,字段至少包括对象主键、退出原因、最后保留期限、是否仍有引用。退出清单不参与保留竞争,但要在去重结果里保留一条指向它的记录,避免以后有人重新把旧对象加回来。
如果退出对象仍被其他页面引用,直接删除会造成断链或数据缺口。此时应先把引用关系改到替代对象,再标记退出。这个动作的检查点是:退出清单里的每个对象,要么没有引用,要么引用已指向明确替代者。满足这个条件后,再执行删除或停用,下一步才是更新报告口径。
一次性手工去重只能解决当前这份报告。要让下次不再出现同样的差异,需要把主键、保留规则和退出标记写进报告生成或数据同步环节。可以用一段简单判断表达:
if 对象主键 in 退出清单: 标记为待退出
elif 对象主键已存在: 按保留规则比较后保留一条
else: 新增记录
加入这段判断后,重新生成一次报告,对比对象数和页面数是否稳定。如果对象数仍然波动,说明主键选择不稳定或上游数据仍在产生重复,下一步应回到数据来源核对,而不是继续在报告层删行。去重的终点不是页数归零,而是每个要保留的对象都有唯一、可执行、可追溯的一条记录。