2011-10-11 80 views
3

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

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

问题:

有3个表:

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

User 
(
    ID, 
    Username, 
    Password, 
    ProfileID 
) 

ProfileID 
(
    ID, 
    Name, 
    Description 
) 

用户和资料可以有多个RightsSets。 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

嗯......这真的不是关于用户和配置文件的问题......它是关于3个实体之间的关系,其中2个实体可以具有3个倍数,但是3个必须正好属于1. –

回答

1

这是一个艰难的一个对我来说,绕到我的头,但你可以考虑以下结构:

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

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

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

+0

如果我在ProfileId和UserId上添加了Unique,那不会消除拥有多个RightsSets的用户的可能性吗? –

+0

@Andrija:不,您可以拥有许多拥有相同“EntityId”的RightsSets,因此属于同一个配置文件或用户。 –

+0

当然。 RightsSet的PK被移至实体。这实际上很有意义。比你! –

2

添加具有亚型UserProfile一个超Entity表(1:1与两者的关系)。

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

+0

+1,我沿着相同的路径走(甚至使用实体)。 –

+0

我接受了其他答案,因为它是清洁剂。即使它们本质上是相同的。总之,谢谢! –

+0

谢谢。注意它们不是相同的答案,只是相似。我的将不会有NULL。这两个版本的JOIN将有所不同,不确定哪一个更清晰。 –