2012-10-27 70 views
10

在用戶表中更好地表示用戶權限還是在其自己的權限表中更好地表示用戶權限?在數據庫中表示用戶角色的更好方法

權限在用戶表
把權限在用戶表中意味着使在用戶表中的每個許可的一列。一個優點是查詢應該運行得更快,因爲在將用戶與用戶權限關聯時不需要聯接。缺點是擁有許多權限列會使用戶表混亂。

權限的權限表連接到用戶表許多一對多的關係
這樣做,這樣乾淨地分離出來自用戶表的權限,但需要在兩個表聯接接入用戶權限。數據庫訪問可能較慢,但數據庫設計看起來更清晰。

也許保留在單獨的表中權限更好時,有許多權限。做出這個決定還有哪些其他考慮因素,哪種設計在各種情況下更好?

回答

20

訪問控制的標準模式被稱爲基於安全作用。由於均爲用戶數量您需要的不同類型的權限數量會增加,您的用戶到權限鏈接的管理會變得越來越困難。

例如,如果您有五個管理員和五十個用戶,那麼您如何保持每個組的權限同步?當您的某個用戶被提升爲管理員時,您需要進行多少次修改?答案是創建兩個交叉點:用戶對角色角色對權限

在我對this question的回答中描述了該解決方案(包括實體關係圖)。

enter image description here

+2

這是一個更復雜的應用程序的強大的答案。正如@Nurkeiwicz所指出的,一個簡單的應用程序甚至可能不需要卷表或權限表。 – steampowered

+0

漂亮的圖表,你使用了什麼工具? – dangerousdave

+1

@dangerousdave - 對不起,延遲響應,我已經出城。我使用帶有定製的智能形狀的Visio,使用James Martin ERD可視化慣例和自定義線條樣式,使其具有手繪外觀。 –

4

當不同角色/權限的數量相對較小時,您的第一種方法是可行的。例如,如果您只有兩種類型的用戶:普通和管理員,則單獨的表看起來像是一種矯枉過正的行爲。單列is_admin列足夠簡單。

但是,一旦角色數量超過幾個,這種方法就不會擴展。它有幾個缺點:

  • 用戶表變得非常「寬」有很多空列(浪費空間)

  • 添加到系統的新角色需要改變用戶表。這很麻煩並且對於大型用戶數據庫可能是耗時的

  • 列出用戶角色需要列舉所有列,而不是簡單的數據庫查詢。

+0

枚舉權限列,以顯示對數據庫中的所有卷和運行ALTAR命令 - 兩件事情我沒想到的。單獨的桌子很快變得更加可取。 – steampowered

相關問題