質問

Railsにロールベースのアクセス制御システムを作成する方法について考えています。私はこれらの素晴らしいプロジェクトも(とりわけ)見ました:

私の質問は、すべてのために結合テーブルを持つ必要があるのですか?関係のテーブルの1つに数値が少ない場合(たとえば100未満)、結合テーブルをその小さなテーブルとマージすることはできませんか?)これが私が意味することです...これが必要なことです:

モデル

  • ユーザー
  • グループ
  • 役割
  • 許可
  • userroles/lolesusers
  • Grouproles
  • メンバーシップ(グループユーザー)
  • rolepermissions

そんな感じ...

Rolerequirement 作品は、aを作成することです roles テーブルとa roles_users テーブルに参加します。これは、アプリケーションで20の合計可能な役割がある場合、私は持っていることを意味します

  • 20行のロールテーブル
  • nowsのロールサイザーテーブル。

つまり、役割ごとにユーザーを見つけたいと思うたびに、参加する必要があります。私は疑問に思っていますが、アプリケーションには少数の役割しかないので、なぜこの移行を置き換えてはいけません。

create_table "roles", :force => true do |t|
  t.string "name"
end

create_table "roles_users", :id => false, :force => true do |t|
  t.integer "role_id"
  t.integer "user_id"
end

これで...

create_table "roles", :force => true do |t|
  t.string "name"
  t.integer "user_id" # or some polymorphic form
end

それは重複を引き起こします(たとえば「管理者」という名前の多くの役割)が、スペースは安く、私たちは次のような方法を作成できます Role.unique (その20列のテーブルを取り除くために)すべてのユニークな役割を見つけるために、なぜ人々は参加テーブルを作成するのですか?

許可と同じこと:開始するための4つの権限のみがある可能性があります。 create read update delete. 。したがって、権限テーブルとロール_permissionsテーブルは必要ありません。crud権限を複製して、権限テーブルに役割を持つことができました。グループと同じように、私の中に多型の列があった場合、私はグループの役割を必要としません roles テーブル。

これを行うための推奨方法は何ですか?

がここにあります 提案された移行のスニペット.

役に立ちましたか?

解決

私はあなたがこれをすることを提案しません。あなたが説明するものは呼ばれます 非正規化.

非正規化は多くのアプリケーションに問題をもたらし、明確な場合にのみ行う必要があります 必要 それのための。私は通常、レポート目的でテーブルを非正規化します。

あなたの質問は、あなたが非定型化する必要があることを示していません。むしろ、「余分な」テーブルを持つことと、単純な結合を避けることに対する誤った避難所を示しています。複製されたデータコストだけでなく、単なるスペースよりも多く、パフォーマンスもかかります(ユニークではありません)。現代のRDBMは、参加者のハンドリングに非常に熟達しています。

グーグルと検索を提案することをお勧めします。ゴールデンルールはありませんが、あなたのケースは正当な理由がないようです。

パフォーマンスの向上を探している場合は、ActiverCordをゴミ箱に投げてください。多くの選択肢があり、あなたはあなた自身を書くことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top