13

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

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

Permission 表中的权限以多对多关系连接到 User 表
这样做可以将权限与用户表完全分离,但它需要跨两个表连接才能访问用户权限。数据库访问可能会更慢,但数据库设计似乎更干净。

当有许多权限时,将权限保存在单独的表中可能会更好。做出此决定时还有哪些其他考虑因素,在各种情况下哪种设计更好?

4

2 回答 2

28

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

例如,如果您有 5 个管理员和 50 个用户,您如何使每个组的权限保持同步?当您的一位用户被提升为管理员时,您需要进行多少次编辑?答案是创建两个交集:users-to-rolesroles-to-permissions

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

在此处输入图像描述

于 2012-10-27T20:10:36.003 回答
4

当不同角色/权限的数量相对较少时,您的第一种方法是可行的。例如,如果您只有两种类型的用户:普通用户和管理员,单独的表看起来有点过头了。单列is_admin就足够了,而且很简单。

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

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

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

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

于 2012-10-27T18:34:44.863 回答