FOREIGN KEY
SQL制約を使用して達成できる最善の方法は、各住宅ローンの種類が各サブタイプテーブルに最大で1回表示されるようにすることです。必要に応じて、1対0または1の関係になります。この制約を適用する1つの方法は{ ID , type }
、スキーマ全体で使用される2列の複合キーを使用しtype
、サブテーブル制約でテストできるようにすることです。これは、2つの住宅ローンのサブタイプを使用した大まかなスケッチです(中括弧は、暗黙の順序のないリストを示します)。
Mortgages { mortgage_ID , mortgage_type }
KEY { mortgage_ID }
KEY { mortgage_ID , mortgage_type }
CONSTRAINT mortgage_type = 'Tracker'
OR mortgage_type = 'Fixed'
FixedRateMortgages { mortgage_ID , mortgage_type , fixed_rate }
KEY { mortgage_ID , mortgage_type }
FOREIGN KEY { mortgage_ID , mortgage_type } REFERENCES Mortgages
CONSTRAINT mortgage_type = 'Fixed';
FixedRateMortgages { mortgage_ID , mortgage_type , base_rate , track_rate }
KEY { mortgage_ID , mortgage_type }
FOREIGN KEY { mortgage_ID , mortgage_type } REFERENCES Mortgages
CONSTRAINT mortgage_type = 'Tracker';
Clients { client_ID }
KEY { client_ID } ;
Agreements { mortgage_ID , mortgage_type , client_ID }
KEY { mortgage_ID , mortgage_type , client_ID }
FOREIGN KEY { mortgage_ID , mortgage_type } REFERENCES Mortgages
FOREIGN KEY { client_ID } REFERENCES Client;
SQL製品を指定していません。厳密な1対1の参照整合性は、サブタイプテーブルロジックごとにこの「分散」されたものをカプセル化するようにCREATE ASSERTION
宣言された制約を使用して、標準SQL-92で維持できます。DEFERRABLE INITIALLY DEFERRED
次に、SQLステートメントは、トランザクションでASSERTION
sを延期し、参照テーブルと参照テーブルを変更してから、ASSERTION
sを再適用できます(またはトランザクションをコミットすることでこれを自動的に実行します)。残念ながら、をサポートする実際のSQL製品はありませんCREATE ASSERTION
。ベンダーに応じて回避策があります。たとえば、トリガー、行レベルのCHECK
制約から呼び出されるSQL関数のテーブル式、テーブルからの書き込み権限の取り消し、参照整合性を保証するCRUDプロシージャを介したテーブルの更新をユーザーに強制するなどです。
とは言うものの、SQLでは通常1対0または1の関係を持つことが許容され、実際にそうすることには利点があります。たとえば、データベースの制約を記述しやすくする(したがってバグを減らす)、ユーザーを強制しない柔軟性1セットの手順などを使用します。