我正在尝试了解使用权限的最佳方式,据我所知,有两个主要选项。
第一个选项是使用按位运算,为此我将使用以下数据库结构:
用户
user_id | user_permission
---------------------
1 | 15
2 | 1
权限
permission_id | permission_name
-----------------------
1 | Read
2 | Write
4 | Execute
8 | Delete
然后检查用户是否具有权限,我将使用以下操作:
$user_permission & $permission_id
我看到的主要好处是:
- 设置、获取和验证权限很简单
- 更少的存储空间(没有子数据库;每个用户权限没有额外的行)
我看到的主要缺点是:
- 列出用户的权限稍微复杂一些
- 不能使用外键约束
- 有限的权限(如果使用 64
BIGINT
)
第二种选择是使用多对多子表,为此我将使用以下数据库结构:
用户
user_id
-------
1
2
权限
permission_id | permission_name
-----------------------
1 | Read
2 | Write
3 | Execute
4 | Delete
用户权限
user_id | permission_id
-----------------------
1 | 1
1 | 2
1 | 3
1 | 4
2 | 1
然后为了检查用户是否有权限,我将使用该操作( s$user_permission
数组在哪里permission_id
):
in_array($permission_id, $user_permission);
我看到的主要好处是:
- 可以使用外键约束
- 简单列出用户的权限
- 允许更多的权限
我看到的主要缺点是:
- 更大的存储空间(子数据库;每个用户权限的附加行)
- 设置和获取权限稍微复杂一些
问题
其中哪一个是更好的选择?我看到了每个人的优点和缺点,不确定哪个更合适。尽管我知道上下文可能起作用;那么在哪些情况下按位运算会更好,在哪些情况下多对多子表会更好?还是有我不知道的第三种选择?
我目前更倾向于使用多对多表来获得外键约束和更多权限可能性的好处,但我想知道我是否遗漏了其他东西;按位操作权限似乎很普遍,所以我认为使用它们是有充分理由的。