2つのテーブルがあります。
- ユーザー
- 住所
ユーザーには住所への参照が含まれています。
アドレスには、ユーザーへの参照である列CreatedByおよびModifiedByが含まれます。
周期的な依存関係を避けるために、このデータベースをどのように設計しますか?
2つのテーブルがあります。
ユーザーには住所への参照が含まれています。
アドレスには、ユーザーへの参照である列CreatedByおよびModifiedByが含まれます。
周期的な依存関係を避けるために、このデータベースをどのように設計しますか?
回答:
ヒントやトリック(遅延制約を含む)を検索する代わりに、この「参照ロック」から抜け出す方法を単純に設計することをお勧めします。次のようなものを試してください。
事実
(UserID)
が存在します。(AddressID)
はUserによって作成されました(UserID)
。(AddressID)
はDateに作成されました(DateCreated)
。(AddressID)
最後で変更されたユーザー(UserID)
に日付(ModifiedOn)
。(UserID)
はDateからAddressに常駐しています。(AddressID)
(ValidFrom)
制約
Each
アドレスはexactly one
Userによって作成されました。It is possible that more than one
アドレスはthe same
Userによって作成されました。
Each
住所はexactly one
Dateに作成されました。It is possible that more than one
住所はthe same
Dateに作成されました。
For each
住所 and
日付、that
住所はによって変更されたat most one
ユーザーにthat
日付。
For each
ユーザー and
日付、that
ユーザーは日付以来at most one
アドレスを常駐しています。that
論理的
必須アドレスに関する限り、アプリケーション層でそれを確認し、ロードステートメントをトランザクションにラップします。このようにして、すべてまたは何も取得しません。
最初のテーブルを作成するときに1つのテーブルが存在しないため、次の2つの操作で循環依存関係を作成することはできません。
CREATE TABLE A (A_ID INT PRIMARY KEY, B_FK INT);
CREATE TABLE B (B_ID INT PRIMARY KEY, A_FK INT REFERENCES A(A_ID));
ALTER TABLE A ADD B_FK INT;
循環依存を回避したい場合。次に、1つのREFERENCES制約を削除するか、DELETEとUPDATE CASCADE参照を1つの方法で追加できます。ロジックが多少複雑な場合は、TRIGGERを実装することもできます。