0

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

私の質問は、すべての結合テーブルが本当に必要なのかということです。リレーションシップ内のテーブルの1つに値が少ない(たとえば100未満)場合、結合テーブルをその小さなテーブルとマージすることはできませんか?)これが意味します...必要なものは次のとおりです。

モデル

  • ユーザー
  • グループ
  • 役割
  • 許可
  • UserRoles / RolesUsers
  • GroupRoles
  • メンバーシップ(GroupUsers)
  • RolePermissions

そんな感じ...

RoleRequirementが機能する方法は、rolesテーブルとroles_users結合テーブルを作成することです。これは、アプリケーションに合計20の可能な役割がある場合、次のことを意味します。

  • 20行のロールテーブル
  • n行のRolesUsersテーブル。

つまり、役割ごとにユーザーを検索するたびに、参加する必要があります。ただし、アプリケーションにはロールが数個しかないため、この移行を置き換えてみませんか。

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

これにより重複が発生します(たとえば、「admin」という名前のロールが大量にあります)が、スペースが安価であり、Role.uniqueすべての一意のロールを検索するようなメソッドを作成できるため(20行のテーブルを削除するため)、なぜ人々は作成するのですか?結合テーブル?

パーミッションについても同じです。開始するパーミッションは4つだけですcreate read update delete。したがって、パーミッションテーブルとroles_permissionsテーブルは必要ありません。CRUDパーミッションを複製して、パーミッションテーブルにrole_idを含めることができます。rolesグループと同じように、テーブルに多態的な列がある場合は、グループロールは必要ありません。

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

提案された移行のスニペットを次に示します

4

1 に答える 1

2

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

非正規化は多くのアプリケーションに問題を引き起こし、明確な必要性がある場合にのみ実行する必要があります。私は通常、レポート目的でのみテーブルを非正規化します。

あなたの質問は、あなたが非正規化する必要があることを示していません。むしろ、それは「余分な」テーブルを持ち、単純な結合を回避することへの誤った嫌悪感を示しています。データを複製すると、スペースだけでなく、パフォーマンスも犠牲になります(ユニークは景品ではありません)。最新のRDBMSは、結合の処理に非常に精通しています。

非正規化に関する情報をグーグルで検索してSOを検索することをお勧めします。黄金律はありませんが、あなたのケースには正当な理由がないようです。

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

于 2010-02-20T02:18:09.467 に答える