多くのアプリケーション、重要なアプリケーション、銀行などがこれを日常的に行っていると確信しています。
すべての背後にある考え方は次のとおりです。
- すべての行に履歴が必要です
- すべてのリンクは一貫性を保つ必要があります
- 「現在の」列を取得する要求を簡単に行う必要があります
- 陳腐化したものを購入したクライアントは、この製品がカタログの一部ではなくなっても、購入したものを見る必要があります。
等々。
これが私がやりたいことであり、私が直面している問題を説明します。
すべてのテーブルにこれらの列があります。
id
id_origin
date of creation
start date of validity
start end of validity
また、CRUD操作のアイデアは次のとおりです。
- create =
id_origin
=id
、date of creation
= now、start date of validity
= now、end date of validity
= nullで新しい行を挿入します(=は現在のアクティブなレコードであることを意味します) - 更新=
- read = =
end date of validity
nullですべてのレコードを読み取ります - 「現在の」レコード
end date of validity
= nullをend date of validity
= nowで更新する - 新しい値で新しいものを作成し、
end date of validity
= null(=は現在のアクティブなレコードであることを意味します)
- read = =
- 削除=「現在の」レコード
end date of validity
をend date of validity
= nowで= null 更新
だからここに私の問題があります:多対多の関連付け。値を使って例を見てみましょう:
- テーブルA(id = 1、id_origin = 1、start = now、end = null)
- テーブルA_B(start = now、end = null、id_A = 1、id_B = 48)
- テーブルB(id = 48、id_origin = 48、start = now、end = null)
ここで、テーブルAを更新し、レコードID = 1にします
- レコードID = 1をend = nowでマークします
テーブルAに新しい値を挿入し、...リレーションを複製しない限り、リレーションA_Bを失ってしまった...これはテーブルになります:
テーブルA(id = 1、id_origin = 1、start = now、end = now + 8mn)
- テーブルA(id = 2、id_origin = 1、start = now + 8mn、end = null)
- テーブルA_B(start = now、end = null、id_A = 1、id_B = 48)
- テーブルA_B(start = now、end = null、id_A = 2、id_B = 48)
- テーブルB(id = 48、id_origin = 48、start = now、end = null)
そして...まあ私は別の問題があります:関係A_B:私は(id_A = 1、id_B = 48)を廃止するかどうか(A-id = 1は廃止されますが、B-48ではない)とマークしますか?
これに対処するには?
これを大規模に設計する必要があります。製品、パートナーなどです。
これに関するあなたの経験は何ですか?どうしますか(どうしましたか)?
-編集
この非常に興味深い記事を見つけましたが、「カスケード陳腐化」に適切に対応していません(=私が実際に求めていること)