2011-01-07 7 views
2

あなたがここに私のモデルを見ることができます。usersテーブルのカラムとしてロールを持つ方がよいか、またはジョインテーブル(ロール&アサインメント)を使用してロールする方が良いですか? - Railsの3

https://gist.github.com/768947

をちょうど何が起こっているかを説明するために、私はいくつかのモデルを持っています。私のアプリの中核には、プロジェクト、ステージ、アップロード、コメント、ユーザーがあります。次に、ユーザ認証を管理するためのロールが割り当てられています(&)。

私はログインのためにプラグインdeclarative_authorization & deviseでこれを行います。

最初の質問は、ユーザーモデル/テーブルに「ロール」の列を追加し、そこに各ユーザーのロールを格納する方が良いでしょうか?複数のロールを持つユーザーがいる場合は、すべてのロールを配列として格納し、必要に応じてそれらのロールを循環させることができます。

また、私は今セットアップをしているようにするのが良いですか?2つの別々のテーブルと割り当てを設定するための束を使用していますか?私はデザイナー、クライアント、管理者、スーパーユーザーの4つの役割しか持っていません。

コンピューティングリソースの観点からは、ジョインよりも各列のクエリを実行する方が「コストがかからない」という意味で、それほど重要ではないという点で、

私の疑問の根源は...今、私は単にcurrent_user.projects.each do |project|を実行し、そのようにサイクルを実行するcurrent_userに割り当てられたプロジェクトを取得したいと思っています。これは私がやった後です:@projects = current_user.projectsプロジェクトのコントローラです。私の他のすべてのモデルにも同じことが適用されます - ユーザ&ロールを除く

しかし、「クライアント」の役割を持つユーザーを探したければ、非常に素早く畳み込まれます。または私はそれをovercomplicatingですか?

ご協力いただければ幸いです。

答えて

2

別々のユーザーテーブルと役割テーブルを持つ方がよいと思います。ユーザーは多くの役割を持ち、多くのユーザーが同じ役割を果たすことができるため、多対多の関係です。これを行うには、JOIN表(user_roleなど)が必要です。私は3つのテーブルをお勧めします。もちろん、ユーザーと役割の両方にプライマリキーを使用できます。 user_roleテーブルには、主キーごとに1つずつ、それぞれのテーブルに外部キーの関係がある2つの列があります。

これで、「クライアント」というロールを持つすべてのユーザーが必要な場合は、userとuser_roleの間で簡単にJOINできます。特定のユーザーの役割が必要な場合は、3つの表を結合する必要があります。

私はユーザーの役割の配列をお勧めしません。それは最初の正規形に反する。

+0

Hrmm .....この応答duffymoのおかげで...しかし、スケーラビリティの問題についてはどうですか?長期的には、パフォーマンスの面でより多くのクエリを実行する必要はありません(単純な行の検索ではなく、結合の面で)追加の列を持つテーブルではなく3つのテーブルがある場合、正規化にどのような影響がありますか? – marcamillion

+0

正規化の方がはるかに優れています。はるかに複雑なスキーマを持つデータベースは非常にうまく拡張できます。これはまだ1つのクエリです.3つのテーブルを結合することになります。いいえ、あなたが撮影している測定値、あなたがそれを満たしていないというデータ、3つのテーブルJOINを示す測定値が原因となるまでは、パフォーマンスに悪影響を及ぼしません。それが起こると、必要に応じて非正規化することができます。あなたは時期尚早な最適化の罪を犯しています。 – duffymo

+0

それは私が心配していたものです...早すぎる最適化の問題です。ことは、私はあなたの要点の投稿から見ることができますように、私はそれが今のように(ユーザー、役割と割り当て)設定している。しかし、私はロールへのアクセスについての助言を得ていました。私が与えられたアドバイスはちょうどそのものでした。ユーザーテーブルに列を追加しました。アドバイスありがとうございます。 – marcamillion

関連する問題