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

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

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

dBASEは、Ashton Tate社が開発したデータベース管理システム (DBMS) です。初期のマイクロコンピュータ向けに開発。広く使用されていました。現在は、RAD環境を取り入れたVisual dBASEとして、米dBASE社が提供しています。

Q&A

解決済

1回答

318閲覧

DB設計の正規化に対する質問

yuto_920101

総合スコア7

dBASE

dBASEは、Ashton Tate社が開発したデータベース管理システム (DBMS) です。初期のマイクロコンピュータ向けに開発。広く使用されていました。現在は、RAD環境を取り入れたVisual dBASEとして、米dBASE社が提供しています。

0グッド

0クリップ

投稿2019/07/29 07:26

前提・実現したいこと

DB設計の正規化に対する質問

発生している問題・エラーメッセージ

プログラミングを学び始めて1ヶ月程度の初学者です。
個人開発する上でDB設計に関して生じた疑問があって投稿させて頂きました。

自分はスポーツの試合のレビューサイトを作ろうと考えているのですが、その中で試合日程を選択すれば、チームと選手のデータを表示できるようにしたいと思っています。
なので試合日程とチームのテーブルをアソシエーションしたいのですが、
##match_schedulesテーブル

Columntype
home_teaminteger
away_teaminteger
dateinteger

##teamsテーブル

Columntype
namestring

とした時に、homeとaway2つのカラムを関連づける方法が分かりませんでした。

考えた挙げ句に思いついた手段が
##home_teamsテーブル

Columntype
team_idinteger

##away_teamsテーブル

Columntype
team_idinteger

##match_schedulesテーブル

Columntype
home_team_idinteger
away_team_idinteger
dateinteger

##teamsテーブル

Columntype
namestring

とhome_teamsテーブルとaway_teamsテーブルという2つの中間テーブルを用意してアソシエーションさせるという方法なのですが、これがプロの方々から見て良い方法なのか自信がありませんでした。他に良いアソシエーションの方法があれば是非ご教授承りたいです。

分かりづらい質問内容で申し訳ございません。アドバイスの程、宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ホームチームもアウェーチームも、どちらもチームであることに変わりはありません。
しかもある試合ではホームであるチームが、別の試合ではアウェーになることは普通にあります。
ですので、どちらも「チームのID」を使って紐付けましょう。

なのでまず、teams に ID を(name とは別に)付けましょう。

ColumnTypeComment
idintegerチームID(自動設定)
namestringチーム名

こうしておけば match_schedules は、

ColumnTypeComment
home_teamintegerホーム側チームID
away_teamintegerアウェー側チームID
dateinteger試合日

とすっきりします。

余談:
チームにIDを振って管理しておかないと、例えば
・運営母体の会社が変わってチーム名が変わる(例:横浜大洋ホエールズ→横浜ベイスターズ→横浜DeNAベイスターズ)
ような場合に困ったことになります。より確実にはチーム名を別テーブルにして適用日を持たせた方がいいのですが、まあそれは今考えるのは難しいでしょうね。

投稿2019/07/29 07:43

tacsheaven

総合スコア13703

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

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

yuto_920101

2019/07/29 08:10

回答ありがとうございます。 今までアソシエーションで関連づける際は 1、モデルクラスにhas_manyやbelongs_toなどの関係が定義されていること。 2、所属する側のテーブルに所属するクラス名_idというカラムがあること。 と学習していたのでteam_idは1つしか割り振ることができないと思っていました。 勉強になりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問