きめ細かい権限システムを作成していますが、それを実行するための最良の方法を決定するのに苦労しています。私が使用しているデータベースはPostgresです。
基本的に、3つのテーブルがあります。
permissions
-----------
p_id, name, description
permissions_groups
------------------
pg_id, name, description
permissions_users
-----------------
pu_id, user_id
'_id'で終わるものはすべて、、integer
残りはvarchar
またはになりますtext
。
権限システムは、別のテーブルのユーザーIDに依存するより大きなシステムの一部になります。
ここで私は立ち往生しています。私には2つのアイデアがあります:
アイデア1
permissions_group
permissions
整数配列となると呼ばれる列があります。これにはp_id
、そのアクセス許可グループのすべてが含まれます。
permissions_users
pg_ids
ユーザーが持つすべてのアクセス許可グループを含む整数配列と呼ばれる列と、グループに属していない割り当てられたアクセス許可のすべてを持つ(int配列)と呼ばれる列があります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
2番目のアイデアは、より古典的なSQLです。3つのテーブルは同じままです。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の概念を見落としていませんか?