2017-01-10 92 views
0

看完之後Database design: 3 types of users, separate or one table?我對如何設計數據庫感到困惑。具有3個角色的數據庫設計用戶

---------------------- 1st Design ----------------------

USERS

  • 用戶名(PK)
  • 密碼
  • 賬戶類型(管理員,經理或工人)

PRO:當日志中我可以輕鬆地檢索,如果這個用戶是管理員,經理,工作人員

CON:我無法使用這種設計形成關係(ONE Manager to MANY Workers)。

----------------------第二個設計----------------------

USERS

  • 用戶名(PK)
  • 密碼

ADMINS

  • 用戶名(PK和FK到USERS.username)
  • 密碼

MANAGERS

  • 用戶名(PK和FK到USERS.username)
  • 密碼

工人

  • 用戶名(PK和FK到USERS.username)
  • 所有者(FK到MANAGERS.username)
  • 密碼

PRO:關係可以形成

CON:

  • 登錄時我有t通過查看每個表中的 ,找到用戶是管理員/經理/工作人員。
  • 如果一個用戶名在ADMINS,MANAGERS和WORKERS中多次出現(很關注!!!)

我已經花了幾個小時搜索谷歌良好的設計,但找不到任何解決方案。我確定這種要求很常見?請提供一些見解!謝謝!

+0

MySQL或PostgreSQL? – Jasen

+0

我正在使用PostgreSQL,但概念應該是一樣的權利? – Zanko

+0

對於任何類型的關係型數據庫來說都應該是一樣的,我試圖弄清楚我是否應該閱讀整個問題。 – Jasen

回答

1

您可以與第一個設計形成一對多關係類型 - 只需添加一個ManagerID,該ManagerID返回UserID。

你最終的東西是這樣的:

UserID Username AcctType ManagerID 
1   Bob   Manager  NULL 
2   John  Worker  1 

另一種方法是添加第三個表,做了工人和管理者之間的聯繫。

用戶表:

UserID Username AcctType 
1   Bob   Manager 
2   John  Worker 
3   Mark  Worker 

UserLink表:

ManagerID UserID 
1   2 
1   3 
+0

嗨,對於用戶鏈接表,如果有這樣的數據(1,2)(1,3)(2,3)... Worker to Worker?可能會發生數據完整性?另一個問題可能是一個工人可能有許多經理。如果有辦法強制這個讓我知道!如果沒有鏈接表,我們如何確保經理/管理員的行爲符合預期?這不是隨機值的經理ID – Zanko

+0

也許我們可以強制ManagerID爲NULL,如果AccType是管理員/管理員? – Zanko

+0

UserLink表格允許工人擁有多個經理,甚至可以讓經理擁有經理。 ManagerID和UserID這兩個字段都是鏈接到用戶表的外鍵,因此它們不能有垃圾數據。 – PhillipXT

1

金色的設計將是:

users (id, username, pass, ...) 
roles (id, role, ...) 
role_users(id, role_id, user_id, ...) 
0

另一種方式:

users: 
    id    serial primary key 
    name   text 
    password  text 
    role   roletype  
    manager  int 
    managerrole roletype 

和一些約束。

foreign key (manager,managerrole) references users (id,role) 

check (case when role = 'worker' then managerrole is not distinct from 'manager' and manager is not null else managerrole is null and manager is null end) 

現在第一個約束迫使管理者存在於用戶表,並且第二約束強制執行,只有與角色的用戶worker S能有一個經理,並利用第一contraint強制執行,所有這些manager■找角色'manager'

我想你也需要一個unique指數on (id, role) 和普通指數on (manager,managerrole)

+0

嗨,感謝您的意見!爲什麼我們需要額外的經理字段?我們不能只有管理員引用是值或NULL,如果它是管理員/管理員? – Zanko

+0

它在那裏,以便外鍵約束可以確保經理列指向的ID具有適當的角色。 – Jasen

+0

我明白你的意思了! CHECK(CASE WHEN role!='Worker' THEN manager IS NULL END)將不起作用,因爲我似乎無法檢查何時角色是worker,而manager是有效的manager。這個問題非常棘手,並且沒有直接的解決方案:(解決方案感覺如此「hackish」哈哈 – Zanko