我正在创建一个细化的权限系统,并且无法确定最佳方法。我使用的数据库是Postgres。
基本上,我将有3个表:
permissions
-----------
p_id, name, description
permissions_groups
------------------
pg_id, name, description
permissions_users
-----------------
pu_id, user_id
以' _id'结尾的任何内容将是integer
,其余为varchar
或text
。
权限系统将成为更大系统的一部分,我依赖于另一个表中的用户ID。
在我被困的地方。我有两个想法:
permissions_group
将有一个名为permissions
的列,它将是一个整数数组。这将包含该权限组的所有p_id
。
permissions_users
将有一个名为pg_ids
的列,它将是一个包含用户拥有的所有权限组的整数数组,以及一个名为permissions
(int数组)的列,其中包含所有p_id
1}分配的权限不属于某个组。
示例数据:
permissions
-----------
1, add_user, Can create a user
2, delete_user, Can delete a user
3, view_users, Can view all users
4, random_perm, Some example permission
permissions_groups
-----------------
1, user_management, User management, [1,2,3]
// This group contains permissions 1,2, and 3
permissions_users
-----------------
1, 1, [1], [4]
// This user links to user with id of 1, has permissions group 1 and permission 4
第二个想法是更经典的SQL。 3个表将保持不变。将有2个新表:
permissions_groups_link
-----------------------
pgl_id, pg_id, p_id
permissions_users_link
----------------------
pul_id, pu_id, p_id, pg_id
现在它会像这样工作:
permissions_users[pu_id]
|
V
permissions_users_link[pu_id]
|
V
p_id OR pg_id
| |
V V
permissions[p_id] <- permissions_groups[pg_id]
示例数据:
permissions
-----------
1, add_user, Can create a user
2, delete_user, Can delete a user
3, view_users, Can view all users
4, random_perm, Some example permission
permissions_groups
-----------------
1, user_management, User management
permissions_groups_link
-----------------------
1, 1, 1
2, 1, 2
3, 1, 3
// Assign permissions 1,2, and 3 to group 1
permissions_users
-----------------
1, 1
permissions_users_link
----------------------
1, 1, 4, NULL
2, 1, NULL, 1
// Assign permission 4 to user 1
// Assign group 1 to user 1
最后,所有这些数据都将聚合到一个包含用户拥有的所有权限的列表中,而不管组是什么。因此,通过上面的示例,服务器端代码将所有这些汇总到:
Permissions for user 1:
1 => add_user
2 => delete_user
3 => view_users
4 => random_perm
这些组仅用于视觉区分和每个用户轻松应用权限。
哪一个想法会扩展得最好并且速度最快?假设在实时环境中,有10000个用户和1000个权限,每个用户平均拥有500个权限。
或者这两个想法真的很糟糕,我是否忽略了一些基本的RDBMS概念,这些概念会让它变得更容易?
答案 0 :(得分:0)
我不使用数组列来存储这些权限,尤其是如果您将为每个用户拥有500个权限。数组列不允许您对权限/组和权限/用户关系具有任何外键约束
在3个选项中,我会选择最后一个选项;
用户N:N权限 N组:N许可 用户N:N组
如果未定期更新权限,您可以考虑使用“NESTED”或MPTT表来存储权限,这样可以在多个级别设置权限,例如:用户对用户拥有“所有”权限和/或让组继承其他组的权限。
您可能会发现ACL的这个解释很有趣: http://book.cakephp.org/2.0/en/core-libraries/components/access-control-lists.html