次のモデルの関連付けを持つ 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 つのクエリを生成します。最初にユーザーを検索し、次にユーザーに基づいてグループを検索します。