5

アクセス許可を操作する最善の方法を理解しようとしていますが、私が知る限り、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

私がこれに見る主な利点は次のとおりです。

  1. アクセス許可の設定、取得、および検証が簡単
  2. 少ないストレージ (子データベースなし、ユーザー権限ごとの追加行なし)

私がこれに見る主な欠点は次のとおりです。

  1. ユーザーのアクセス許可の一覧表示は少し複雑です
  2. 外部キー制約を使用できません
  3. 制限された権限 (を使用する場合は 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);

私がこれに見る主な利点は次のとおりです。

  1. 外部キー制約を使用できます
  2. ユーザーの権限を一覧表示するのは簡単
  3. はるかに多くの権限を許可します

私がこれに見る主な欠点は次のとおりです。

  1. より大きなストレージ (子データベース、ユーザー権限ごとの追加行)
  2. アクセス許可の設定と取得がやや複雑

質問

これらのうちどれがより良い選択肢でしょうか? それぞれに利点と欠点があり、どちらがより適切かはわかりません。コンテキストがおそらく役割を果たしていることは承知していますが。では、どのような状況でビット単位の操作がより適切であり、どの状況で多対多の子テーブルがより適切になるのでしょうか? または、私が知らない 3 番目のオプションはありますか?

私は現在、外部キー制約の利点とより多くの許可の可能性のために、多対多テーブルを使用する傾向がありますが、他に何か欠けているのではないかと思います。ビット単位の操作権限はかなり普及しているように見えるので、それらを使用する正当な理由があると思います。

4

2 に答える 2

2

私はビット単位の操作ソリューションには行きません。スペースが本当に窮屈でない限り、これを独自のテーブルとマッピング テーブルに分割しても、ディスクのコストはそれほどかかりません。あなた以外の人にとっては理解しやすく、この方法で FK 関係をより簡単に強制することができます。また、おっしゃったように、権限の数は事実上無制限に増やすことができます。テーブルにインデックスを付ける方法によっては、「読み取り権限を持つすべてのユーザーを表示する」などのクエリは、実行が速く、理解しやすいように思えます (これは主観的なことだと思います)。

于 2013-03-21T21:31:06.740 に答える