UserとClubのモデルがあったとして、その関連を表すMembershipモデルのようなものは必要ありますか?
Userにbelong_to_club_ids
Clubにhas_user_ids
のような配列をidを格納する配列を持たせるでは機能的に不十分ですか?
不十分であればどのように不十分であるか教えていただきたいです。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
バックエンドがSqliteやMySQLのようなRDBMSであれば、持たせるべきです。
というのも、UserとClubで、属するデータを二重管理していると、片方を変更したときにもう片方の変更を怠るようなバグを出してしまったときに、どちらが正しいデータだったかわからなくなる、というデータの損失を伴う不整合となるからです。
このように、「1対多」のデータを列方向に開いて、複数の「1対1」データの関連として表現し直すことを、データベースの正規化の1つとして、「第1正規化」といいます。
Railsの場合、has_many through:
の形を使えば、このような中間テーブルを入れた多対多関係も簡単に定義できます(なお、Rails wayでは、中間テーブルはclub_users
のような名前が適当です)。
投稿2017/02/04 23:52
総合スコア145184
0
情報が少なすぎて、どんな機能を設計してるのかわかりませんが。。。
Userが1つのClubにしか所属できないのであれば、
Clubモデルにuser_idを持つのではなく、
Userモデルにclub_idを持つべきです。
なぜなら、Clubに対してUserがいくつ紐づくかわからない配列(無限長の配列)になるからです。
データベースに入りきらないですし、現実的ではないです。
ruby
1club.has_user_ids 2# => [1,2,3,4,5,6,78,9,10,11,12...................................∞]
また、Userが複数のClubに所属できるのであれば、多対多の関係になるため、
Membershipモデルを中間テーブルとして作成する必要性が出てきます。
投稿2017/02/04 11:13
総合スコア797
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/02/04 11:28
2017/02/04 11:33
2017/02/04 11:35
退会済みユーザー
2017/02/04 12:00
2017/02/04 23:48
2017/02/05 01:07
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/02/05 00:32