2011-10-11 87 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將有所不同,不確定哪一個更清晰。 –