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

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

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

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

4回答

17612閲覧

総当たり戦表のデータベース設計について

Farman

総合スコア14

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2016/07/23 04:41

編集2016/07/23 04:43

お世話になります。
現在、以下のような総当たり戦表のようなデータを保存するためのDBをMySQLで設計したいと考えています。

総当たり戦表

###1つのチームに持たせたい情報

  • チーム名
  • 相手チームとの勝敗

###現在の課題
例:
Aチームに対する勝敗データの持ち方として、
Bとの勝敗、Cとの勝敗・・・
とチーム分のカラムを用意して勝敗フラグを持たせる

という方法ではチームが増えたときにカラムを新たに増やす必要があり、
スマートではないと思っています。

このようなデータ設計を考えた場合、
どのような設計方法が良いのでしょうか。

データベース設計の勉強中の身なので、
初歩的な質問かもしれませんが、知恵をお貸しいただけると幸いです。

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

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

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

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

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

guest

回答4

0

ベストアンサー

表からすると、同じ相手とホーム、アウェイで二戦するタイプの総当たり戦のようですね。

テーブル設計するときはこう考えます。
「大会名、ホームチーム、アウェイチームが決まれば勝敗が決まる」と。
勝敗は(大会、ホームチーム、アウェイチーム)の関数なのです。

するとテーブルは
・大会テーブル
・チームテーブル
・勝敗テーブル
の3つを用意して、勝敗テーブルのカラムは
・大会ID
・ホームのチームID
・アウェイのチームID
・勝敗
の4項目となります。
このうち全三者がプライマリキーですね。

データベースにおいてテーブルとは関数であり、関数の引数はプライマリキーなのです。
(そういうデータベースの基本になっている理論を関係代数と呼んでいます)

投稿2016/07/23 08:19

yuba

総合スコア5570

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

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

Farman

2016/07/23 09:09

回答ありがとうございます。 設計の考え方、とても勉強になります。 今後のほかのDB設計にも生かせそうです。 ありがとうございます!
guest

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

KiyoshiMotoki

総合スコア4791

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

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

Farman

2016/07/23 09:12

回答ありがとうございます。 SQL文まで載せていただいて、とても勉強になります。 考え方もとても参考になりました!ありがとうございます!
guest

0

この場合、
テーブルを
チームテーブル(チーム名やID,チームそのものの情報を持つ)
対戦結果テーブル(どことどこが対戦したかをそれぞれチームのIDで持つ、どちらが勝ったか、対戦時間他の情報)

という感じでテーブルを分けて、チームのIDを使って各テーブルを連携させる

というのが一番単純なデータベース設計になるかと思います。

投稿2016/07/23 05:34

tanat

総合スコア18716

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

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

Farman

2016/07/23 09:07

回答ありがとうございます。 とてもシンプルでイメージが湧きました!
guest

0

ただ表示するだけなら、DBに情報を持たせる意味ないんじゃないですか?というのが回答になると思います。
どうしても使いたいなら、どう使っても良いですし。
条件/使用用途を整理された方が良いです。

例えば、試合名が複数あり、試合名ごとに表を作成したい。とか
勝敗表に各試合の点数を表示したい。とか
別に勝率表をつくりたい。とか

投稿2016/07/23 04:54

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Farman

2016/07/23 05:01 編集

回答ありがとうございます。 すみません、情報が不足していましたね。 仰る通り、試合名が複数あって、試合名ごとに表を作成したい。 というのが今回の目的です。 本文にも投稿させていただきます。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2016/07/23 05:31

タグをちゃんと見てなかったのですが、sql だけで表示まで行いたいということだとすると、ハードル高い気がします。私では表示用の sql のイメージが作れないです。 他の方から回答があるといいのだけれど。。。
Farman

2016/07/23 09:10

回答ありがとうございます。 SQLでの表示はなくても大丈夫です。 ほかの回答者様の回答を参考に設計したいと思います。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問