1

ユーザーと関連するプロファイルを使用してシナリオをモデル化する必要があります。

要件:

ユーザーは必須の個人プロファイル(ProfileA)を持っている必要があり、オプションでビジネスプロファイル(ProfileB)を持つこともできます。

ユーザーは、プロファイルタイプごとに1つのプロファイルのみを関連付ける必要があります。

ここで、データベース設計についての私の考えです。特に、アイデアBでNullableFKを使用するための意見や考えをお聞かせください。

別のモデリングソリューションもある場合は、私と共有してください。前もって感謝します。

アイデアA:

Users
------------------
UserID   PK

ProfilesA
------------------
UserID   PK FK 

ProfilesB
------------------
 UserID   PK FK

IDEA B(Nullable FKを使用):

Users
------------------
UserID     PK
ProfileAId  NULL    FK
ProfileBId  NULL    FK

ProfilesA
------------------
ProfileAId   PK

ProfilesB
------------------
ProfileBId   PK FK
4

1 に答える 1

1

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の制約を使用してProfileAvsを要求します。単に許可し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を除外できるため、これはおそらく価値がありません。

于 2012-06-22T10:31:16.790 に答える