具有3个角色的数据库设计用户

时间:2017-01-10 04:00:22

标签: mysql sql database postgresql database-design

阅读Database design: 3 types of users, separate or one table?后,我对如何设计数据库感到困惑。

---------------------- 1st Design ---------------------- < / p>

用户

  • 用户名(PK)
  • 密码
  • 帐户类型(管理员,经理或工作人员)

PRO:登录时,如果此用户是Admin,Manager,Worker

,我可以轻松检索

CON:我不能使用这种设计形成关系(ONE Manager与MANY Workers)。

---------------------- 2nd Design ---------------------- < / p>

用户

  • 用户名(PK)
  • 密码

ADMINS

  • 用户名(PK和FK到USERS.username)
  • 密码

管理员

  • 用户名(PK和FK到USERS.username)
  • 密码

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

PRO:可以形成关系

CON:

  • 登录时,我必须通过查找来查找用户是否为Admin / Manager / Worker 在每个表中。
  • 如果一个用户名在ADMINS,MANAGERS和WORKERS之间多次出现(BIG CONCERN !!!),也很难执行。

我花了几个小时搜索谷歌的好设计,但找不到任何解决方案。我确信这种要求很常见?请提供一些见解!谢谢!

3 个答案:

答案 0 :(得分:2)

您可以与第一个设计形成一对多关系 - 只需添加一个引用回UserID的ManagerID。

你最终得到这样的东西:

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

另一个选择是添加第三个表,用于执行worker和manager之间的链接。

用户表:

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

UserLink表:

ManagerID    UserID
1            2
1            3

答案 1 :(得分:1)

黄金设计将是:

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

答案 2 :(得分: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的用户可以拥有一个管理器并利用第一个约束来强制执行所有这样的{{1 }}具有角色manager

我认为您还需要'manager'索引unique 和普通索引on (id, role)