お世話になります。
現在、以下のような総当たり戦表のようなデータを保存するためのDBをMySQLで設計したいと考えています。
###1つのチームに持たせたい情報
- チーム名
- 相手チームとの勝敗
###現在の課題
例:
Aチームに対する勝敗データの持ち方として、
Bとの勝敗、Cとの勝敗・・・
とチーム分のカラムを用意して勝敗フラグを持たせる
という方法ではチームが増えたときにカラムを新たに増やす必要があり、
スマートではないと思っています。
このようなデータ設計を考えた場合、
どのような設計方法が良いのでしょうか。
データベース設計の勉強中の身なので、
初歩的な質問かもしれませんが、知恵をお貸しいただけると幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
表からすると、同じ相手とホーム、アウェイで二戦するタイプの総当たり戦のようですね。
テーブル設計するときはこう考えます。
「大会名、ホームチーム、アウェイチームが決まれば勝敗が決まる」と。
勝敗は(大会、ホームチーム、アウェイチーム)の関数なのです。
するとテーブルは
・大会テーブル
・チームテーブル
・勝敗テーブル
の3つを用意して、勝敗テーブルのカラムは
・大会ID
・ホームのチームID
・アウェイのチームID
・勝敗
の4項目となります。
このうち全三者がプライマリキーですね。
データベースにおいてテーブルとは関数であり、関数の引数はプライマリキーなのです。
(そういうデータベースの基本になっている理論を関係代数と呼んでいます)
投稿2016/07/23 08:19
総合スコア5570
0
私も tanat様、yuba様の回答に同意です。
"チーム"に関する情報と"試合"に関する情報は、別々のテーブルで管理してやるのがよいでしょう。
設計の単純さに加えて、リレーショナルモデルの観点からも、その方が自然だと思うからです。
(通常、レコード数がカラム数に影響することはないので)
MySQLを例に話しますと、
具体的には、以下のようなテーブル設計になります。
sql
1# "チーム"に関する情報を格納するテーブル 2CREATE TABLE teams ( 3 id INT PRIMARY KEY AUTO_INCREMENT, 4 name VARCHAR(64) NOT NULL UNIQUE 5); 6 7# "試合"に関する情報を格納するテーブル 8# 1つのレコードが1試合を表す 9CREATE TABLE round_robin_tournaments ( 10 left_team_id INT NOT NULL, 11 right_team_id INT NOT NULL, 12 result VARCHAR(128) DEFAULT NULL, 13 14 UNIQUE (left_team_id, right_team_id), 15 16 FOREIGN KEY (left_team_id) REFERENCES teams (id), 17 FOREIGN KEY (right_team_id) REFERENCES teams (id) 18);
こうしてやれば、チーム・試合それぞれに対してチーム名や試合結果の他、必要な情報を適宜、カラムとして追加できるようになります。
(例えばチームの本拠地や対戦日時、試合会場など)
試合の組み合わせは、以下のSQLで作成できます。
各チームが1回ずつ対戦する場合
sql
1INSERT INTO round_robin_tournaments (left_team_id, right_team_id) 2SELECT _left.id, _right.id 3 FROM teams AS _left 4 INNER JOIN teams AS _right 5 ON _left.id < _right.id;
http://sqlfiddle.com/#!9/6db3d0/1
2回ずつ対戦する場合
sql
1INSERT INTO round_robin_tournaments (left_team_id, right_team_id) 2SELECT _left.id, _right.id 3 FROM teams AS _left 4 INNER JOIN teams AS _right 5 ON _left.id <> _right.id;
http://sqlfiddle.com/#!9/33264f/1
データの見せ方(ご質問のように表形式で表示したい、など)については、アプリケーション側で工夫してやるのがよいでしょう。
投稿2016/07/23 08:29
総合スコア4791
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ただ表示するだけなら、DBに情報を持たせる意味ないんじゃないですか?というのが回答になると思います。
どうしても使いたいなら、どう使っても良いですし。
条件/使用用途を整理された方が良いです。
例えば、試合名が複数あり、試合名ごとに表を作成したい。とか
勝敗表に各試合の点数を表示したい。とか
別に勝率表をつくりたい。とか
投稿2016/07/23 04:54
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/23 05:01 編集
退会済みユーザー
2016/07/23 05:31
2016/07/23 09:10
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/23 09:09