如何确保以多对多关系删除冗余数据

时间:2009-01-11 01:55:49

标签: sql-server sql-server-2008 many-to-many

我正在尝试确保在没有更多使用级联删除的引用时自动删除某些数据。我将使用基于Stack Overflow的数据库进行解释。

我有一张Post表。每篇文章都有零到多个标签。

所以看起来应该是这样的:

  

发布< - > PostTags< - >标签

例如。

  

帖子1有标签'A','B','C'Post 2   有'C','D'标签。

现在,我正在做的是当我删除帖子2的所有标签(例如DELETE FROM PostTags WHERE PostId = 2)时,我想标记'D'也被删除,因为没有其他人参考它。我认为级联删除会处理这个问题,但当然只有当你从Tag->PostTagsPost->PostTags级联时才会这样做。

我不知道如何处理这个问题。

我担心人们会建议使用触发器:((系统的额外复杂性)。

思想?

注意:DB是MS Sql2008。

2 个答案:

答案 0 :(得分:2)

不幸的是,你不能在这里使用级联。当您拥有多对多关系时,级联不起作用,因为您没有引用该子级的单一父级(在这种情况下,您有多个PostTags条目可以引用该标记表)。

触发器是一种方法,但我不推荐它。相反,我建议您在数据层中删除PostTags表中的条目后,删除不再引用的标记。如果你有一个删除条目的存储过程,你可能想考虑在那里做这个(这样做也相对简单)。

答案 1 :(得分:0)

我认为您必须在Posts表上使用on delete触发器,它会检查要删除的帖子的标签,如果没有被引用则删除它们(在PostTags表中)。

在删除帖子之前,请保存此记录集:

SELECT tagID, count(*) from PostsTags WHERE postId = 2 group by tagID;

然后,在删除它之后,循环遍历此recordsoet,如果count(*)= 1,则删除标记。