在数据库中表示用户角色的更好方法

时间:2012-10-27 18:19:00

标签: database database-design user-permissions

在用户表中更好地表示用户权限,还是在自己的权限表中表示更好?

用户表格中的权限
将权限放在用户表中意味着为用户表中的每个权限创建一列。优点是查询应该运行得更快,因为在将用户与用户权限相关联时不需要连接。缺点是拥有许多权限列会使用户表变得混乱。

权限表中的权限已加入具有多对多关系的用户表
这样做可以干净地从用户表中分离出权限,但需要跨两个表的连接才能访问用户权限。数据库访问速度可能较慢,但数据库设计似乎更清晰。

如果有许多权限,也许在单独的表中保留权限会更好。做出这个决定还有哪些其他考虑因素,哪种设计在各种情况下都更好?

2 个答案:

答案 0 :(得分:23)

访问控制的标准模式称为基于角色的安全性。由于两者用户数您需要增加的不同类型权限的数量,用户到权限链接的管理可能变得越来越困难。

例如,如果您有五个管理员和五十个用户,那么如何保持每个组的权限同步?当您的某个用户升级为管理员时,您需要进行多少次修改?答案是创建两个交叉点:用户到角色角色到权限

在我对this question的回答中描述了这个解决方案(包括实体关系图)。

enter image description here

答案 1 :(得分:4)

当不同角色/权限的数量相对较小时,您的第一种方法是可行的。例如,如果您只有两种类型的用户:普通用户和管理员用户,则单独的表看起来像是一种过度杀伤力。单is_admin列足够简单。

但是,一旦角色数量超过一些,这种方法就无法扩展。它有几个缺点:

  • 用户表变得非常“宽”,有很多空列(浪费空间)

  • 向系统添加新角色需要更改用户表。这很麻烦,对于大型用户数据库来说可能非常耗时

  • 列出用户角色需要枚举所有列,而不是简单的数据库查询。