網頁

2018/5/5

ER-Model 使用者,角色,權限的資料庫設計

一個系統一定會有使用者,而複雜一點的系統就會讓不同的使用者有不同的存取權限,而要達成這樣的需求該如何設計呢?

在這之前工作上有稍微接觸,但終究沒有自己設計過,也不知道現實的實際應用情況為何,剛好最近在Facebook的Backend 台灣 (Backend Tw)社團看到有人提出下面問題,所以趁這機會也來設計看看。

原po的問題如下。

請教大家在設計資料庫時,假設使用者帳號會有3種類型(管理員、員工、與公司),會如何去做設計呢? 我的做法是:分別會有『管理員、員工、公司』三張資料表,還有一張資料表儲存『角色』類型。

不過這種做法,在需要紀錄是哪個使用者進行資料庫操作時,會導致每筆資料需要額外儲存『角色類型』。 如:新增或修改一項產品時,都要記錄誰新增或修改 那麼在產品資料表就要有 『新增使用者』、『新增角色類型』、『修改使用者』、『修改者角色類型
(藍色文字是我揣測作者原意做的修改,原文是"...那麼在產品資料表就要有 『新增者角色類型』、『新增者角色類型』、『修改者角色類型』、『修改者角色類型』")


因為管理員、員工、公司資料在不同資料表,他們有各自的流水號都是從1開始。 假設帳號不分開資料表儲存,就會有id為1的公司、id為1的員工還有id為1的管理員無法同時存在的帳號資料表的問題。...

不過想請問針對 每個需要紀錄『新增者與修改者』的資料表都會需要存他的role與id,有什麼更好的改善方式嗎?...


圖中的三個使用者存的資料都是id與name與phone,這是為了解釋而簡化過後的資訊,實際上員工可能會有職稱、性別、員工編號等欄位,如果將公司資訊一併儲存在同一張資料表,不是會違反正規化嗎?...

..................


依照原po的ER-Model應該如下。


然後在問答中有人提到了RBAC以角色為基礎的存取控制

所以我參考RBAC的設計改成如下。不過對於不同角色擁有不同的屬性的設計(user_role_attribute資料表)也不知道這樣是否可行,希望高手能看到能幫我批改一下。至於role對自己的一對多關係是階層(母子)關係。


但後來想想,上面的設計還是有問題,必須要有個表紀錄每個角色所擁有的屬性,也就是下面的role_attribute,但不紀錄屬性值,因為同個角色但不同使用者的同個屬性值會不同,所以使用者的角色屬性要記錄在另一張表user_role_attribute


2 則留言:

  1. 想請問這個圖表是用什麼畫的?

    回覆刪除
  2. MySQL Workbench的eer diagram功能

    回覆刪除