这是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
表中的ProfileId
和UserId
上指定Entity
约束,然后根据需要在RightsSet
中创建尽可能多的记录。两个可能的问题是,ProfileId
中的UserId
和Entity
都为空或它们都具有值时。您可以在插入记录之前进行一些验证,以确保不会发生这种情况。关于sql - 一对多还是多对多?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7733386/