2012-02-16 69 views
0

我正在考慮涉及具有用戶和用戶角色的模式設計,但我不確定哪條路線更好。用戶角色數據庫架構設計

選項1

創建三個表,一個與用戶信息,一個與角色信息,並用一個個用戶的角色關係。

users { 
    u_id, 
    etc 
} 

roles { 
    r_id, 
    r_name, 
    etc 
} 

user_roles { 
    u_idm 
    r_id 
} 

選項2

創建兩個表,一個與用戶信息,和其他與角色,角色信息,以及相關信息。

users { 
    u_id, 
    etc 
} 

roles { 
    r_id, 
    u_id, 
    r_name, 
    etc 
} 

選項1更強大,但需要額外的連接。選項2將需要一個額外的主鍵,但只會是一個連接。如果我更改角色名稱,使用選項進行更新需要更長的時間,但我不希望更新頻繁。

對於可擴展的解決方案,哪個更好?我錯過了什麼其他的見解?這是針對mysql和postgresql的解決方案。

回答

1

選項1. 如果只有一個用戶可以擁有每個角色,那麼角色有什麼用? 如果您有100個註冊用戶,則會有100個「註冊用戶」的重複定義。

「等」越多,你的數據庫就會越大。

擁有那麼多副本會減慢數據庫的速度,最終事情會變慢很多,即使你只有一個連接少一點。

如果你運行很多基於角色的查詢,並且像你需要一個類似於選項2的數據庫那樣的數據庫,你仍然可以創建一個視圖並讓數據庫緩存它,但是我懷疑這對你有什麼好處。

0

我會去與一些變化的第一個選項:

- each user can belong to ONLY ONE group 
- create a table defining privileges 
- each group has a list of privileges 

定義的權限可以被映射到應用程序的不同模塊或特定的功能。

該解決方案簡單,靈活,快捷。 特權和組表都應該非常小,所以額外的JOIN不會產生如此嚴重的影響。此外,經過身份驗證的用戶權限可以存儲在會話中,而不是每次都加載。 由於解決方案非常靈活並且易於擴展,因此長期會有更多優勢。

例如,您將創建一個名爲「Configuration」的新模塊,並且您希望創建一個名爲「superadmin」的新用戶組,以便隨處訪問和「配置」。您只需在數據庫中進行更改:創建組「superadmin」,添加權限「配置」,設置所有權限,就是這樣。

+0

一組不符合本網站的要求。用戶可以是品牌,會員,品牌管理員,客戶等或者這些種類的組合。 – 2012-02-16 18:38:55