1

我需要使用用户和关联的配置文件来建模一个场景。

要求:

用户必须具有强制性的个人资料 (ProfileA),用户也可以选择拥有业务资料 (ProfileB)。

用户必须与每个配置文件类型关联只有 1 个配置文件。

这是我关于数据库设计的想法,我很想听听你的意见和想法,特别是在想法 B 中使用 Nullable FK。

如果您也有替代建模解决方案,请与我分享。提前致谢。

想法一:

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

IDEA A不会强制ProfileA.

假设不是 NULL, IDEA BUser.ProfileAId可以,但这引入了只能通过延迟约束(MS SQL Server 不支持)解决的循环 FK。除此之外,您还需要一个 UNIQUE 约束User.ProfileBId来防止不同的用户共享相同的ProfileB内容(这需要额外的索引,并且每个新索引都会带来一定的开销,特别是如果您打算使用集群)。


由于我们正在处理“1:1”(User: ProfileA)和“1:0 或 1”(User: ProfileB)关系,我可能只是将所有内容放在同一个表中,然后使用 NOT NULL 与 NULL 约束来要求ProfileA与。只是允许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字段保留在 中User,但将ProfileB字段移动到单独的表中,就像您在 IDEA A 中所做的那样(不需要 IDEA B 的复杂性)。但是,NULL 存储很便宜,您可以使用过滤索引从索引中排除 NULL,因此这可能不值得。

于 2012-06-22T10:31:16.790 回答