0

次のモデルの関連付けを持つ Rails 3 アプリケーションがあるとします。

user
  belongs_to :group

item
  belongs_to :group
  belongs_to :user

コードが慎重に記述されていない場合、次のようなデータの不一致が発生する可能性があります。

item.group

item.user.group

同じグループを返さなければならないときに返さなくなりました。アイテムは、常に 1 つのグループにのみ属する必要があります。

私の理解では、この重複した関連付けは、クエリを簡単にする (結合するテーブルの数を減らす) ために作成された可能性があります。

したがって、私の質問は、これはまったくひどい慣行なのか、それとも有効なトレードオフの問題なのかということです。データと関連付けの重複が許容される場合があるということです。

アップデート

これまでのところ、答えは「トレードオフ」であり、「悪い習慣/コードの匂い」ではないようです。

おそらく制約、利点、欠点、ユースケースなどが混在しているため、これを処理できる方法は複数あるようです。

1) 上記の非正規化された複製データ 2) item has_one :group, :through => :user 3) item delegate :group :to => :user

アプローチ#2と#3の違いを理解しようとしています。コンソールで両方のアプローチを試してみたところ、 item.group が呼び出されたときに Rails によって生成されるクエリが異なるようです。(2) グループとユーザーを結合する単一のクエリを生成します。(2) は 2 つのクエリを生成します。最初にユーザーを検索し、次にユーザーに基づいてグループを検索します。

4

1 に答える 1