这是BestPractice问题(或者至少我希望是这样)。

编辑:此示例只是为了澄清问题。可以是Person,Office,ContactInformation。

问题:

有3个表:

RightsSet
(
    ID,
    CanView,
    CanEdit,
    ObjectTypeID,
    ObjectID
)

User
(
    ID,
    Username,
    Password,
    ProfileID
)

ProfileID
(
    ID,
    Name,
    Description
)

用户和个人资料都可以具有多个RightsSet。
RightsSet必须属于1(且仅1)用户或配置文件。

如何实现呢?
我应该创建其他表格吗
UserRightsSets
(
    UserID,
    RightsSetID
)

ProfileRightsSets
(
    ProfileID,
    RightsSetID
)

问题是:
如何确保在删除ProfileRightsSet时,同时删除RightsSet(因为RightsSet属于配置文件,并且仅属于配置文件)?
如何确保RightsSet仅属于个人资料而不属于个人资料和用户?

或者,我可以修改RightsSet表
RightsSet
(
    ID,
    CanView,
    CanEdit,
    ObjectTypeID,
    ObjectID,
    UserID,
    ProfileID
)

这个问题...好吧,如果多个对象共享RightsSet怎么办? (好吧,我想不出任何例子,但是我确信在两种以上的实体共享一种实体的有效场景中。)

最佳答案

对于我来说,这是一个艰难的过程,但是您可以考虑以下结构:

Entity
---------
EntityId
ProfileId --nullable
UserId --nullable

RightsSet
----------
EntityId
CanView
CanEdit
ObjectTypeID
ObjectID

使用此方法,您可以在UNIQUE表中的ProfileIdUserId上指定Entity约束,然后根据需要在RightsSet中创建尽可能多的记录。两个可能的问题是,ProfileId中的UserIdEntity都为空或它们都具有值时。您可以在插入记录之前进行一些验证,以确保不会发生这种情况。

关于sql - 一对多还是多对多?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7733386/

10-15 07:14