この質問にはすでに答えがあります:
ルックアップ テーブルはどのくらい重要ですか?
(答えは7つ)
3 年前
に閉店しました。
各ユーザーが権限のリストを持つ必要があるユーザーのテーブルがあります。
別の回答では、特定のユーザーに権限を割り当てるには、ユーザー ID を持つ権限と呼ばれる 2 番目のテーブルを使用する必要があると赤色で回答しました。
userID | permission
--------|----------
1 | read
1 | write
1 | delete
このソリューションを使用すると、ユーザーの ID を持つすべての権限を選択するだけで、特定のユーザーのすべての権限を取得できます。
これについて非効率だと思うのは、このテーブル内のさまざまなユーザーに対してすべての権限が繰り返されるという事実です。
userID | permission
--------|----------
1 | read
1 | write
1 | delete
2 | write <- repeating with different userid
私の場合、少なくとも 150 人のユーザーとおそらく 100 を超える権限が必要です
テーブルが大きくなってしまいますか?
これは非常に一般的なケースだと思います。しかし、より良い方法が見つかりませんでした。
100x150=15k、これは決して大きくありません。たとえあなたの許可があったとしてもon フィールドの長さはレコードあたり平均 10 バイトですが、正規化モデルの場合は 1 バイト / tinyint なので、サイズの違いは約 135 KB です。実際に正規化を推進するのはテーブルのサイズではありません。
– シャドウ
2020 年 9 月 3 日 12:14
------------------------
すべての可能な権限のリストを含む新しいテーブルを作成し、それらの ID をユーザー ID にリンクするだけです。
- Permissions ( ID | Description )
- User Permissions ( UserId | PermissionID )
単一ユーザーのすべての権限を選択するには
SELECT Permissions.*
FROM UserPermissions
LEFT JOIN Permissions ON Permissions.id = UserPermissions.PermissionId
WHERE UserPermissions.UserID = {userId}
------------------------
このように 3 番目のテーブルを作成してみてはいかがでしょうか?
userID | other columns for users
--------|-------------------------
1 |
2 |
3 |
userID | permissionID
--------|----------
1 | 1
1 | 2
1 | 3
2 | 2
permissionID | permissionName
--------------|----------
1 | read
2 | write
3 | delete