IDEAAはの存在を強制しませんProfileA
。
IDEA Bは、User.ProfileAId
がNULLでない場合に可能ですが、これにより、遅延制約(MS SQL Serverではサポートされていない)を介してのみ解決できる循環FKが導入されます。それに加えて、User.ProfileBId
異なるユーザーが同じものを共有できないようにするために、UNIQUE制約が必要になります(これには追加のインデックスが必要であり、特にクラスタリングProfileB
を使用する場合は、新しいインデックスごとに特定のオーバーヘッドが発生します)。
User
「1:1」( :)ProfileA
と「1:0または1」(User
:)の関係を扱っているのでProfileB
、おそらくすべてを同じテーブルに配置し、NOTNULLとNULLの制約を使用してProfileA
vsを要求します。単に許可しProfileB
ます。
User
------------------
UserID PK
ProfileARequiredField1 NOT NULL
ProfileARequiredField2 NOT NULL
ProfileARequiredField3 NOT NULL (...)
ProfileAOptionalField1 NULL
ProfileAOptionalField2 NULL
ProfileAOptionalField3 NULL (...)
ProfileBRequiredField1 NULL
ProfileBRequiredField2 NULL
ProfileBRequiredField3 NULL (...)
ProfileBOptionalField1 NULL
ProfileBOptionalField2 NULL
ProfileBOptionalField3 NULL (...)
-- For ProfileB, if one required field is present, all must be present,
-- and optional fields are allowed only if required ones are present.
CHECK (
(
ProfileBRequiredField1 IS NULL AND
ProfileBRequiredField2 IS NULL AND
ProfileBRequiredField3 IS NULL AND
ProfileBOptionalField1 IS NULL AND
ProfileBOptionalField2 IS NULL AND
ProfileBOptionalField3 IS NULL
)
OR (
ProfileBRequiredField1 IS NOT NULL AND
ProfileBRequiredField2 IS NOT NULL AND
ProfileBRequiredField3 IS NOT NULL
)
)
ProfileA
または、フィールドをに保持しますが、IDEA Aですでに行ったように、フィールドを別のテーブルにUser
移動ProfileB
します(IDEA Bを複雑にする必要はありません)。ただし、NULLストレージは安価であり、フィルター処理されたインデックスを使用してインデックスからNULLを除外できるため、これはおそらく価値がありません。