バージョン管理されたデータを中心に展開するデータ モデルを設計するための最良の方法について、意見を求めています。1 対多および多対多の関係があり、バージョンごとにすべて変更できます。
最終的な目標は効率的な比較であり、可能であればデルタのみを保存するといういくつかの異なる戦略を探しています。
バージョン管理されたデータを中心に展開するデータ モデルを設計するための最良の方法について、意見を求めています。1 対多および多対多の関係があり、バージョンごとにすべて変更できます。
最終的な目標は効率的な比較であり、可能であればデルタのみを保存するといういくつかの異なる戦略を探しています。
これは実際にはかなり難しい問題です。
オブジェクトのバージョン管理は簡単です。それらの間の接続のバージョン管理はそれほど多くありません-いくつかの設計上の決定を行う必要があります。例えば:
その上、ほとんどの「サポート」テーブルはおそらく「バージョン対応」である必要があります。
もし私があなたなら、私はおそらく次の出発点から自分の道を歩むでしょう:
OBJECTとCONNECTIONの間の記号は、「カテゴリ」(別名、継承、サブクラス、一般化階層など)です。
この設計の背後にある基本的な考え方は、「スナップショット」、「復元」、および「デルタ」機能をサポートすることです。
クエリは次のようになります。
オブジェクトA、B、Cを配置する必要があるとします。ここで、AはBとCの親です。
generation: 0
A0
/ \
B0 C0
新しいオブジェクトDを追加します。
generation: 0 1
A0
/ | \
B0 C0 D1
AとCを変更し、Bを削除します。
generation: 0 1 2
A0
A2
/ | \
B0 C0 D1
B2* C2
(*) OBJECT_VERSION.DELETED is true
CをAからDに移動します。
generation: 0 1 2 3
A0
A2
/ |* \
B0 C0 D1
B2* C2 |
C3
等...
この設計は、一貫性のない削除を伴う異常に対して開かれています。データベースは、削除されたオブジェクトと削除されていないオブジェクトの接続、または接続を削除せずにオブジェクトの1つを削除状態に進化させることから自身を防御しません。両方のエンドポイントを調べるまで、接続が有効かどうかはわかりません。データが階層的である場合は、代わりに「到達可能性モデル」を使用できます。ルートオブジェクトから到達できる場合、オブジェクトは削除されません。オブジェクトを直接削除することはありません。オブジェクトへのすべての接続を削除するだけです。これは、フォルダ/ファイルなどの階層でうまく機能します。「上」から始めて、目的のオブジェクトに到達するまで下に向かって検索します。
「不変」接続の代わりに、OBJECT_VERSIONからCONNECTION_VERSIONを継承し、そこにPARENT_ID / CHILD_IDを配置し、識別関係を使用して、ひし形の依存関係が正しくモデル化されていることを確認します。これは、移動の履歴を追跡する必要がある場合に役立ちます。
もちろん、これらは単なる幅広いストロークです。あなたが自分の道を見つけてくれることを願っています...