gpt4 book ai didi

performance - PostgreSQL 中的多行与多列与数组

转载 作者:行者123 更新时间:2023-11-29 14:01:26 26 4
gpt4 key购买 nike

我正在创建一个细粒度的权限系统,但在决定最好的方法时遇到了困难。我使用的数据库是 Postgres。

基本上,我将有 3 个表:

permissions
-----------
p_id, name, description

permissions_groups
------------------
pg_id, name, description

permissions_users
-----------------
pu_id, user_id

任何以“_id”结尾的都将是一个整数,其余的将是varchartext

权限系统将成为更大系统的一部分,我依赖于另一个表中的用户 ID。

这是我卡住的地方。我有两个想法:

想法1

permissions_group 将有一个名为 permissions 的列,它将是一个整数数组。这将包含该权限组的所有 p_id

permissions_users 将有一个名为 pg_ids 的列,它是一个包含用户拥有的所有权限组的整数数组,还有一个名为 permissions 的列(整数数组)具有不属于组的所有分配权限的 p_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, [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

想法2

第二种思路是比较经典的SQL。 3张 table 将保持不变。将有 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 概念?

最佳答案

不会使用数组列来存储这些权限,尤其是如果您要为每个用户分配 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

关于performance - PostgreSQL 中的多行与多列与数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14464614/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com