SQL问题-账户权限系统

时间:2021-02-11 10:20:00

标签: sql

我正在尝试为帐户制作高级权限系统

  1. 账户可以通过"account_permission"表获得权限(直接)
  2. 帐户可以是具有权限的组的一部分 -> "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'
      );

数据库图

enter image description here

1 个答案:

答案 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)
相关问题