アクセス許可を操作する最善の方法を理解しようとしていますが、私が知る限り、2 つの主要なオプションがあります。
最初のオプションは、ビット演算を使用することです。これには、次のデータベース構造を使用します。
ユーザー
user_id | user_permission
---------------------
1 | 15
2 | 1
パーミッション
permission_id | permission_name
-----------------------
1 | Read
2 | Write
4 | Execute
8 | Delete
そして、ユーザーがアクセス許可を持っていることを確認するには、次の操作を使用します。
$user_permission & $permission_id
私がこれに見る主な利点は次のとおりです。
- アクセス許可の設定、取得、および検証が簡単
- 少ないストレージ (子データベースなし、ユーザー権限ごとの追加行なし)
私がこれに見る主な欠点は次のとおりです。
- ユーザーのアクセス許可の一覧表示は少し複雑です
- 外部キー制約を使用できません
- 制限された権限 (を使用する場合は 64
BIGINT
)
2 番目のオプションは、多対多の子テーブルを使用することです。これには、次のデータベース構造を使用します。
ユーザー
user_id
-------
1
2
パーミッション
permission_id | permission_name
-----------------------
1 | Read
2 | Write
3 | Execute
4 | Delete
user_permissions
user_id | permission_id
-----------------------
1 | 1
1 | 2
1 | 3
1 | 4
2 | 1
そして、ユーザーがアクセス許可を持っていることを確認するには、次の操作を使用します (は s の$user_permission
配列ですpermission_id
)。
in_array($permission_id, $user_permission);
私がこれに見る主な利点は次のとおりです。
- 外部キー制約を使用できます
- ユーザーの権限を一覧表示するのは簡単
- はるかに多くの権限を許可します
私がこれに見る主な欠点は次のとおりです。
- より大きなストレージ (子データベース、ユーザー権限ごとの追加行)
- アクセス許可の設定と取得がやや複雑
質問
これらのうちどれがより良い選択肢でしょうか? それぞれに利点と欠点があり、どちらがより適切かはわかりません。コンテキストがおそらく役割を果たしていることは承知していますが。では、どのような状況でビット単位の操作がより適切であり、どの状況で多対多の子テーブルがより適切になるのでしょうか? または、私が知らない 3 番目のオプションはありますか?
私は現在、外部キー制約の利点とより多くの許可の可能性のために、多対多テーブルを使用する傾向がありますが、他に何か欠けているのではないかと思います。ビット単位の操作権限はかなり普及しているように見えるので、それらを使用する正当な理由があると思います。