アクセス制御システムを作成しようとしています。
アクセスを制御しようとしているテーブルがどのように見えるかを簡略化した例を次に示します。
things table:
id   group_id   name
1    1          thing 1
2    1          thing 2
3    1          thing 3
4    1          thing 4
5    2          thing 5
アクセス制御テーブルは次のようになります。
access table:
user_id  type   object_id  access
1        group  1          50
1        thing  1          10
1        thing  2          100
アクセスは、「モノ」の ID を直接指定して付与するか、グループ ID を指定してモノのグループ全体に付与することができます。上記の例では、ユーザー 1 にはグループ 1 へのアクセス レベル 50 が付与されています。これは、個々のものへのより具体的なアクセスを許可する他のルールがない限り適用されます。
特定のユーザーのアクセス レベルと共にリスト (ID のみで問題ありません) を返すクエリが必要です。したがって、上記の例を使用すると、ユーザー ID 1 に対して次のようなものが必要になります。
desired result:
thing_id   access
1          10
2          100
3          50   (things 3 and 4 have no specific access rule,
4          50   so this '50' is from the group rule)
5               (thing 5 has no rules at all, so although I 
                still want it in the output, there's no access
        level for it)
私が思いつくことができる最も近いものはこれです:
SELECT * 
FROM things 
LEFT JOIN access ON 
    user_id = 1
    AND (
        (access.type = 'group' AND access.object_id = things.group_id)
        OR (access.type = 'thing' AND access.object_id = things.id)
    )
しかし、「もの」テーブルの各行に1つだけが必要な場合、複数の行が返されます。「モノ」ごとに 1 行にまとめる方法や、「グループ」ルールよりも「モノ」ルールを優先する方法がわかりません。
参考になれば、私が使用しているデータベースは PostgreSQL です。
私が見逃した情報がありましたら、お気軽にコメントを残してください。
前もって感謝します!