andがItemありTag、それぞれにidandname列のみItem_Tag_Mapがあり、複合Item.id, Tag.id主キーを持つテーブルがあるとします。
Itemandの履歴テーブルを実装したい場合Tag、これは比較的簡単に思えます -主キーとして and ("INSERT","UPDATE",etc)を使用してorテーブルrevisionにコピーするための 3 番目の列とトリガーを追加できます。アイテムを「削除」したい場合があるため、次の 2 つの方法のいずれかを実行できます。ItemHistoryTagHistoryid, revisionoperation
ItemまたはTagに別の列を追加しis_active、実際に行を削除しないでください。- 行を削除しますが、
delete操作として履歴テーブルに削除を記録し、Itemまたは挿入時に、そのアイテムを含むまたはテーブルからTag最新のrevision番号を取得し、そのように設定しますItemHistoryTagHistory
2番目のオプションは口に悪い味が残るので、最初のオプションを使用しても問題ありません. 結局のところ、アイテムを変更したり、アクティブなステータスを変更したりできるのに、なぜ本当にアイテムを削除する必要があるのでしょうか?
ここで、テーブルの履歴テーブルで同じ問題に遭遇しましたItem_Tag_Mapが、今回はどちらのオプションもそれほど魅力的ではないようです。is_activeに を追加することを選択した場合Item_Tag_Map、タグがアイテムにマップされているかどうかを調べるロジックは次のように変わります。
これらのアイテムのすべての tag_mapping を取得します
に
これらのアイテムのすべての tag_mapping を取得する WHERE is_active
マッピングの存在はマッピングが存在することを意味するという暗黙の考えはなくなります。マッピングされていないアイテム タグのセットには、テーブルに存在しないすべてのタグだけでなく、is_activefalse のタグも含まれます。
一方、2 番目のオプションを選択した場合、それはまだかなり醜いです。
これまでに何度もこの問題に遭遇したことがあると思います。あなたがどのように対処したかを知りたいです。