2

きめ細かい権限システムを作成していますが、それを実行するための最良の方法を決定するのに苦労しています。私が使用しているデータベースは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_grouppermissions整数配列となると呼ばれる列があります。これにはp_id、そのアクセス許可グループのすべてが含まれます。

permissions_userspg_idsユーザーが持つすべてのアクセス許可グループを含む整数配列と呼ばれる列と、グループに属していない割り当てられたアクセス許可のすべてを持つ(int配列)と呼ばれる列がありますpermissionsp_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の概念を見落としていませんか?

4

1 に答える 1

1

特に、ユーザーごとに500のアクセス許可を持つ場合は、これらのアクセス許可を格納するために配列列を使用しません配列列では、アクセス許可/グループおよびアクセス許可/ユーザー関係に外部キー制約を設定できません

3つのオプションのうち、最後のオプションを選択します。

ユーザーN:Nアクセス許可グループN:Nアクセス許可ユーザーN:Nグループ

権限が定期的に更新されない場合は、「NESTED」またはMPTTテーブルを使用して権限を保存することを検討してください。これにより、複数のレベルで権限を設定できます。たとえば、ユーザーはユーザーに対して「すべて」の権限を持っているか、グループに権限を継承させることができます。他のグループから。

ACLに関するこの説明は興味深いものです:http: //book.cakephp.org/2.0/en/core-libraries/components/access-control-lists.html

于 2013-02-03T23:43:03.603 に答える