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