私の質問はDatabase Design for Revisions?に関連していますが、もっと複雑です。多対多のリビジョンのデータベース設計ですか?
私はそれらの間に多対多の関係を持つ2つのテーブルを持っています。
A: A.id, A.data, A.last_change_time
B: B.id, B.data
A_B: A_B.A_id, A_B.B_id, A_B.connected_since_time, A_B.some_status_enum
A_Bコネクタテーブルはリビジョンをサポートする必要があります。 Aの要素とBの要素との間の接続が削除された場合、以前に存在していた履歴情報を保持する必要があります。接続状態が変更された場合、古い状態に関する履歴情報を保持する必要があります。私は生成に必要なレポートの
いくつかは以下のとおりです。(今)すべてでBに接続されていない内のすべての要素の
- 一覧。
- Bの少なくとも1つの要素に特定のステータスで接続されているAのすべての要素のリスト。
- 一度接続されたが接続されていないすべてのA-Bペアのリスト。
- Aの最後の変更時刻が接続時刻の後のすべてのA-B接続のリスト。
- Aの最後の変更時刻が、接続時間をステータスでグループ化した後のすべてのA-B接続の数。
私は接続テーブルにA_B.is_currentブール値フィールドを単に追加すると考えました。接続が削除されたら、単にis_currentをfalseに設定します。ステータスが変わると、古いレコードに対してはis_currentをfalseに設定し、新しいステータスで新しいレコードを追加します。
これまでによく似た質問に対する回答は、「is_current」が不適切な設計であり、より良い解決策が必要であると主張しています。これまでのソリューションでは、単一テーブル内のレコードのリビジョンと、それらのリレーションの関係については言及されていませんでした。
is_current列を使用して多対多接続の履歴を追跡するのは間違っていますか?それが間違っている場合、それはどんな問題を引き起こすか?よりよい解決策は何ですか?
この音声は論理的です。 nullで記録するValidToは現在のレコードです。関係のステータスを変更すると、古いレコードが現在の時刻で更新されます。 – Muxecoid