2014-10-26 61 views
0

我有三個主要的表:代表許多一對多與約束

users 
===== 
user_id 
user_email 

organizations 
============= 
organization_id 
organization_name 
organization_phone_number 

roles 
===== 
role_id 
role_name 

用戶和組織有很多:很多關係:一個用戶可以屬於多個組織,以及同一個組織可以有多個用戶。

用戶和角色排序的也有許多關係:單個用戶可以有多個角色,並且一個角色可以屬於多個用戶。 但是,角色是組織特定的。含義,如果用戶1屬於組織1,他們將在該組織的「域」中擁有1個以上的角色。如果他們也屬於組織2,他們將擁有1個完全不同的組織角色。

因此,考慮到角色的以下列表:AdminDogCatLionBearFishFrog,你可能有:用戶1屬於ORG 1,他/她是一個Admin。但用戶1也可能屬於組織2,他/她是Cat,LionFrog

我正在尋找合適的表格結構來表示這些剋制的許多關係。

這不只是添加一個users_x_organizationsusers_x_roles人行橫道表,像這樣簡單:

users_x_organizations 
===================== 
id 
user_id 
org_id 

users_x_roles 
============= 
id 
user_id 
role_id 

這是不夠的,因爲它並不代表角色每個組織用戶的列表。它只允許我表示用戶1屬於組織1和組織2,並且在他們所有的成員組織中,他們是管理員,貓,獅子和青蛙。它並沒有告訴我,對於組織1而言,他們只是一個管理員等等。這就是我繪製心理空白的地方,任何想法?

回答

1

你基本上有兩種選擇。您可以將角色劃分爲針對每個組織的特定角色,或者您可以在所有組織中擁有共同角色。例如,無論組織如何,「管理員」角色是否具有相同的role_id?或者,每個組織都會有一個單獨的「管理員」角色。

在第一種情況下(組織間共享角色),您的角色表將爲users_x_organizations_x_roles,並帶有三個外鍵。您是否需要users_x_organizations成爲關於需求的問題。你可以擁有一個「屬於」的「角色」。然後users_x_organizations是真的:

select user_id, org_id 
from users_x_organizations_x_roles uor 
where role_id = 'belongs_to'; 

或許有任何作用就足夠了:

select distinct user_id, org_id 
from users_x_organizations_x_roles uor; 

在第二種情況下(其中的角色是組織特異性的),你的角色表將users_x_roles問題是如何保證關係完整性。也就是說,如何確保用戶的角色與同一用戶的組織匹配。

一般方法是使用約束或觸發器。在大多數數據庫中,不支持交叉數據庫約束或者有點痛苦。所以,完整性可以通過觸發器來保證。另一種方法(我會這樣做)是將所有數據修改代碼包裝在存儲過程中,並在存儲過程代碼中明確進行驗證。

哪種方法更好取決於您的應用程序以及組織和角色之間的相互作用。如果大多數或所有角色在組織之間共享,那麼可能首選第一種方法。如果角色的組織特定性很高,那麼第二種方法可能是首選。