質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

2回答

5002閲覧

中間テーブルに3つ以上のカラムを作成|DB設計

MayuKuno

総合スコア3

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2020/08/24 12:42

###疑問点
結論から質問致しますと、疑問点としては、
中間テーブルに外部キーカラム二つ以外のカラムを作成することは可能でしょうか?

前提・実現したいこと

グループ(Groupテーブル)を作成して、グループの参加者としてユーザー(Userテーブル)をグループに登録します。この状態でGroupとUserは多対多の関係になりますので、Groupテーブル、Userテーブル、group_userテーブル(中間テーブル)の三つが存在します。

そして、そのGroupに登録されたUserの中でクジ引きをさせ、その結果としてプレゼント相手(drawn name)を決めます。
つまり、以下のような例になります。

######例)
説明:グループ1と言うグループの参加者は、以下の4名で、それぞれ4名には()に記載のプレゼント相手がいます。

グループ1
佐藤(--田中)
田中(--伊藤)
高橋(--佐藤)
伊藤(--高橋)
図にすると以下のような形。

イメージ説明
このような場合、drawn name(プレゼント相手)はuser(参加者)に対して一対一の関係になるのですが、drawn nameはGroupありきのカラム となりますので、以下になるのではないかと予想をしております。
イメージ説明

そもそも中間テーブルにそれ以外のカラムを作成するのが可能なのか調べても分からず、かと言って以下のような形で、groupに関連づけずにuserとdrawn nameを1対1の関係にするとGroupと紐づかないと理解しております。
drawn nameはあくまでも、Groupありきのカラムになるので、以下のような形では間違っていると感じております。
イメージ説明

皆さんのご経験・お知恵でお力添えできますと幸いです。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

中間テーブルにキーカラム以外の属性を持たせる ことはできますが、今回の場合、そこに送り相手を入れるのは違和感があります。

というのは。 
ユーザは(復数の)グループに属する、それを表すのが中間テーブルで、その関係(このユーザとこのグループの組み合わせ)に関する情報以外をもたせるのは違和感があります。

tableがひとつ増えてしまいますが、Presentという中間テーブルを作り GroupUserとは別管理にするほうが良いと思います。構造はいま議論しているのと変わらないのはなんですが。。。。
外部keyは送り主と送り先。もし必要なら(外部keyとしてではなく)情報として group_id

投稿2020/08/24 23:29

編集2020/08/24 23:30
winterboum

総合スコア23284

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2020/08/25 00:22 編集

1:1の関係を敢えて分けて管理するメリットって何でしょう?
winterboum

2020/08/25 02:47

ユーザーとグループという関係に他の要素を取り込むと拡張性に懸念が出てきます たとえば プレゼントだけの関係、ならよいのですが ゲームのペアも作る、とかになると厄介になります。 このグループでのプレゼント交換は今回1回限り なら良いのですが複数回あると多対多になります。
sazi

2020/08/25 03:11

1:1じゃなくて1:nになる可能性が高いのではないかというお話なのですね。
sazi

2020/08/25 06:26 編集

> プレゼント交換は今回1回限り なら良いのですが複数回あると この中間テーブルを1とするる話なら、属性として、1回目、2回目、3回目のような属性を追加する必要が出てくるので、別な中間テーブルに持たせるという話ですよね? それなら、新たに作成する中間テーブルとこの中間テーブルの関係は1:nだと思うのですけど。 そうでは無くて、現在の中間テーブルに2回目、3回目を追加する話なら、新たに回数などのキーを追加する話ですし、多対多と言われているのが良く分かりません。
winterboum

2020/08/25 07:10

中間テーブルと中間テーブルに関連をもたせるのではなく、 GroupUser中間テーブルとは独立に プレゼント送り手貰い手 テーブルを作るということです。 中間テーブルというよりは Presentモデルかもしれない
guest

0

中間テーブルに外部キーカラム二つ以外のカラムを作成することは可能でしょうか?

可能です。

中間テーブルにキーカラム以外の属性を持たせるのが正しい設計ですね。

Railsの中間テーブルのカラムにアクセスするには?

投稿2020/08/24 13:20

sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MayuKuno

2020/08/24 13:29

@saziさん、ありがとうございます! 理解いたしました。中間テーブルにキーカラム以外の属性を持たせることができると言うこと理解いたしました。 今回の場合、私が中間テーブルに追加させたいカラムはdrawnNameと言う名のuserテーブルの方法になります(drawnNameもuserのため)。そうなると、中間テーブルには、キーカラムが3つできてしまう認識なのですが、そちらでも可能なのでしょうか? group_idとuser_idと(drawnNameという名の)user_id
sazi

2020/08/25 03:12 編集

drawnNameの為にもう一つ中間テーブルを作成するというのもありますけど、1:1であればそれは冗長すぎだと思うので、中間テーブルに属性として持たせれば良いと思います、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問