阅读Database design: 3 types of users, separate or one table?后,我对如何设计数据库感到困惑。
---------------------- 1st Design ---------------------- < / p>
用户
PRO:登录时,如果此用户是Admin,Manager,Worker
,我可以轻松检索CON:我不能使用这种设计形成关系(ONE Manager与MANY Workers)。
---------------------- 2nd Design ---------------------- < / p>
用户
ADMINS
管理员
工
PRO:可以形成关系
CON:
我花了几个小时搜索谷歌的好设计,但找不到任何解决方案。我确信这种要求很常见?请提供一些见解!谢谢!
答案 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)