一对多还是多对多?

时间:2011-10-11 22:39:50

标签: sql database-design

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

编辑:这个例子只是为了澄清问题。它可能是Person,Office,ContactInformation。

问题:

共有3个表格:

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

User
(
    ID,
    Username,
    Password,
    ProfileID
)

ProfileID
(
    ID,
    Name,
    Description
)

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

如何实现这一目标? 我应该创建其他表吗?

UserRightsSets
(
    UserID,
    RightsSetID
)

ProfileRightsSets
(
    ProfileID,
    RightsSetID
)

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

或者,我可以修改RightsSet表

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

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

2 个答案:

答案 0 :(得分:2)

添加一个超类型Entity表格,其中包含UserProfile1:1两种关系的子类型。

然后,让EntityRightsSet处于1:n关系。

答案 1 :(得分:1)

对我来说,这是一个艰难的过程,但你可能会考虑下面的结构:

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

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

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