冗長データが多対多の関係で削除されるようにする方法
-
08-07-2019 - |
質問
カスケード削除を使用する参照がなくなったときに、一部のデータが自動的に削除されるようにします。 Stack Overflowに基づく fake データベースで説明します。
Post
テーブルがあります。各投稿には0個以上のタグがあります。
したがって、次のようになります。
投稿<!> lt;-<!> gt; PostTags <!> lt;-<!> gt;タグ
eg。
投稿1には、タグ「A」、「B」、「C」の投稿2があります タグ「C」、「D」があります。
今、私がしていることは、投稿2のすべてのタグ(たとえばDELETE FROM PostTags WHERE PostId = 2
)を削除するとき、タグ 'D'も削除することです。カスケード削除でこれを処理できると思っていましたが、もちろん、Tag->PostTags
またはPost->PostTags
からカスケードダウンする場合のみです。
これを処理する方法がわかりません。
トリガーを使用することを人々が提案するのではないかと思います:((システムの複雑さ)。
思考?
注:DBはMS Sql2008です。
解決
残念ながら、ここではカスケードを使用できません。多対多の関係がある場合、子を参照する単一の親が存在しないため、カスケードは機能しません(この場合、Tagsテーブルを参照できるPostTagsエントリが複数あります)。
トリガーはこれを行う方法ですが、お勧めしません。むしろ、データレイヤーで、PostTagsテーブルのエントリを削除した後、参照されなくなったタグを削除することをお勧めします。エントリの削除を行うストアドプロシージャがある場合は、そこでそれを行うことを検討することもできます(比較的簡単に実行できます)。
他のヒント
Postsテーブルでon deleteトリガーを使用する必要があります。このトリガーは、削除される投稿のタグをチェックし、参照されていない場合は削除します(PostTagsテーブルで)。
投稿を削除する前に、このレコードセットを保存してください:
SELECT tagID, count(*) from PostsTags WHERE postId = 2 group by tagID;
その後、削除した後、このレコードセットをループし、count(*)が1の場合、タグを削除します。