2011-02-18 85 views
3

我有2個實體:用戶和組。最簡單的模型是用戶(id,名稱等),組(id,名稱),user_group_rel(user_id,group_id)。但我需要將團體納入其他團體。一個用戶可以在許多組中,並且組可以包括具有自己的用戶和子組的用戶和子組! 需要數據庫模型幫助!數據庫用戶和組模型

Users and groups

回答

4

儘管我同意Ken Down的命名法,但我並不一定同意用戶和角色是同一個實體。

基地的實體:

Users  (user_id, user name, real name, user_status, etc) 
Role  (role_id, role name, role_password, etc) 
Privilege (priv_id, base object, functionality, what have you) 

關聯實體:

User has Role (0 - n) (user_id, role_id) 
Role has Role (0 - n) (role_id, has_role_id) 
User has Privilege (0 - n) (user_id, priv_id) 
Role has Privilege (0 - n) (role_id, priv_id) 
3

這些天,這是由用戶和組坍陷進入「角色」來完成。你所擁有的只是角色,並將角色鏈接到其他角色。有些角色的「登錄」標誌設置爲true,使其成爲有效用戶,而沒有設置「登錄」標誌的角色更像組。

其主要思想是這使得一切都更簡單。您不必維護兩個單獨的概念或實體(用戶和組),但只​​有一個概念:角色。然後你使用該用戶的「登錄」標誌。

編輯:對於表結構來看@XIVSolutions提供的第一個選項,他詳細說明了我在上面提到的內容。它回答了你將一個角色放入其他任何角色的問題。第二個表格是交叉引用,列出了一個角色及其父代。如果一個角色有多個父母,意味着該表中有多個條目,那麼這就像在許多組中有一個用戶。

#DIT:還有:@XIVSolutions表設計,第三個表是將用戶(登錄)作爲單獨管理實體的完全合法方式。

+0

好的。我如何將羣組或用戶包含到多個羣組中? – VeroLom

+0

我需要例子,因爲我是數據庫建模的新手。 – VeroLom

+0

舉例來說,我建議以另一種方式進行:編輯您的問題以提供您想組織的特定安全性通配示例,然後我們可以修改答案以顯示這些解決方案是否適合這些問題。 –

2

重:肯·唐斯的解決方案:

我已經與這兩個版本的播放(和會喜歡聽,如果這是在目標或不...):

選項1:

**tblRole** 
RoleID PK 
RoleName 

**tblRoleIndex** 
ParentRoleID FK on tblRole 
ChildRoleID FK ON tblRole 

NOTE: ParentRoleID and ChildRoleID form a composite Primary key in the above table. 

**tblLogIns** 
LogInID PK 
RoleID 
PassWord 

或者,選擇2:

**tblRole** 
RoleID 
ParentRoleID Recursive FK on tblRole.RoleID 
RoleName 

NOTE: A top-level role in the table above has a default ParentRoleID of -1 or 0 

**tblLogIns** 
LogInID PK 
RoleID 
PassWord 
+0

我越來越近了。對於它的價值,Adam的解決方案也很有趣,而且可能比我的更好。 – XIVSolutions

+0

我受騙 - 這是Oracle在內部使用的用戶和組的模型。 8-) –

+1

@亞當 - 嗯,這不就是生活的全部嗎?避免重新發明車輪? ;-) – XIVSolutions

2

主要癥結建模,這是如何既用戶和組當作組的成員。 Ken Downs的方法將解決這個問題。另一種方法是治療用戶和和組作爲派生類型的公共基類型的:

這種方法的
create table groupmemberbase 
(
    memberid int, 
--optional flag to idicate the type of the derived entity 
--this is similar to the login flag used by Ken Downs 
    membertype int, 
    primary key (memberid) 
) 

create table users 
{ 
    memberid int, 
--more user attributes here 
    primary key (memberid), 
    foreign key (memberid) references groupmemberbase (memberid) 
) 

create table groups 
(
    memberid int, 
--more group attributes here 
    primary key (memberid), 
    foreign key (memberid) references groupmemberbase (memberid) 
) 

create table groupmembers 
(
    groupid int, 
    memberid int, 
    primary key (groupid, memberid), 
    foreign key (groupid) references groups (memberid) 
    foreign key (memberid) references groupmemberbase (memberid) 
) 

一個優點是,它可以防止用戶或組從偶然成爲用戶的成員 - 該限制在模式級別執行。

+0

我也喜歡。從來沒有想過這種方法,但它似乎簡單,乾淨,優雅。 – XIVSolutions