我正在尝试为帐户制作高级权限系统
"account_permission"
表获得权限(直接)"account_group"
和 "permission_group"
表(应该称为 group_permission?)我需要编写 SQL Select 命令,该命令将返回与帐户关联的所有权限(包括组权限)
我有工作示例,但我很确定这不是最佳性能实践......并且“account_id”在我的示例中重复
SELECT
t1.*
FROM
permission AS t1
LEFT JOIN
account_permission AS t2
ON t1.id = t2.permission_id
LEFT JOIN
permission_group AS t3
ON t1.id = t3.permission_id
WHERE
t2.account_id = 'a518f2fb-7e46-4c0c-9428-c87eac6674e8'
OR t3.group_id IN
(
SELECT
group_id
FROM
account_group
WHERE
account_id = 'a518f2fb-7e46-4c0c-9428-c87eac6674e8'
);
答案 0 :(得分:1)
看起来您的代码也可能会产生重复项。我建议将其写为:
SELECT p.*
FROM permission p
WHERE EXISTS (SELECT 1
FROM account_permission ap
WHERE ap.permission_id = p.id AND
ap.account_id = 'a518f2fb-7e46-4c0c-9428-c87eac6674e8'
) OR
EXISTS (SELECT 1
FROM permission_group pg JOIN
account_group ag
ON pg.group_id = ag.group_id
WHERE pg.permission_id = p.id AND
ag.account_id = 'a518f2fb-7e46-4c0c-9428-c87eac6674e8'
);
此版本无法返回重复项(好吧,至少是由于 join
导致的重复项;我想 permissions
可能有重复项)。
那么为了性能,您需要以下索引:
account_perimission(permission_id, account_id)
permission_group(permission_id, group_id)
account_group(group_id, account_id)