MySQLのデータ格納と検索について

このQ&Aのポイント
  • MySQLを使ってサッカーチームの試合データを格納し、検索フォームから条件に応じた結果を得たい。
  • 新しいテーブルを作成し、IDと試合データの情報を格納することで、検索結果を取得することができる。
  • スタメンや得点者などの詳細なデータは別のテーブルに格納し、条件に合致するデータを取得することができる。
回答を見る
  • ベストアンサー

MySQLの構造について

応援しているサッカーチームの試合データをMySQLを利用しテーブルに格納したいと考えています。 そこでMySQLやPHPに詳しい方にお聞きしたいことがあります。 例えばA・B・Cと3チームあるとしたら、A対B、A対Cの試合データは格納しますが、B対Cのデータは不要です。あくまでもAチームに関するデータのみを格納し、私が開設しているサイトで閲覧者に検索フォームから自由な形でデータを参照できるようにしたいです。 参考までに格納したい試合のデータは下記のようなデータです。 http://www.j-league.or.jp/result/2014/j2/030201.html 現在、既に一定のデータはテーブルに格納しています。現在のテーブルの構造です。 https://www.dropbox.com/s/z2qc2zff2fn8m8f/gamedb.pdf?dl=0 スタメンの選手やベンチの選手、交代選手、警告をもらった選手、得点者などはテーブルに格納していません。これらのデータは試合ごとに大きく数が異なるのでどのようにして格納すれば良いのか分からなかったので。 現在は格納していないこれらのデータを格納することで下記のような条件を指定しても対象データが羅列されるようにしたいです。 ・○○選手がイエローカードをもらった試合。 ・点を取られている選手ランキング。□□選手(※対戦相手の選手)には一番点を取られているなど。 ・○○選手がスタメンだった試合。 ・○○選手が途中出場した試合。 ・○○選手はこれまで△試合に▲分出場している。 ・□分~□分の間の得点は何点。逆に失点は何点など。 などなどです。 私が現在思いついている構造ですが、新しくテーブルを複数作成する。こういったケースではそれぞれのテーブルに共通のIDを振る必要があるとのことですが、これは日付(開催日)で代用しようと思っています。同じ日に2試合は絶対にないので。 作成するテーブルは下記のようにします。 ・ホームチームスタメンテーブル ・アウェーチームスタメンテーブル ・ホームチームの警告をもらった選手テーブル ・アウェーチームの警告をもらった選手テーブル ・ホームチーム得点者テーブル ・アウェーチーム得点者テーブル .....などなど。 こういったテーブルを作成し、それぞれID(開催日)と一定数のカラムを予め用意する。得点者のテーブルでしたら1試合で一方のチームが10点を取ることは限りなく0に近いのでとりあえず10用意する。同じように得点した時間も10用意。 datadating(開催日) | goal_1_min(得点時間) |goal_1(得点者) | goal2_min(得点時間) | goal2(得点者) |.......... このように格納していけば思い通りの結果が得られるようになるのかな?と思っていますが、果たしてこのようなテーブルで作成していき、後々サイト側の検索フォームから指定した条件で無事に結果を得られるか不安です。 ちょっとしたことでも良いので、詳しい方の意見をお聞きしたいです。 どうぞよろしくお願いします。 長文失礼しました。

  • MySQL
  • 回答数2
  • ありがとう数12

質問者が選んだベストアンサー

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.2

 まず、やっていいこと、いけないこと。から。 >これは日付(開催日)で代用しようと思っています。同じ日に2試合は「絶対に」ないので。  この部分は、極めて正しい対応です。  でも、 >1試合で一方のチームが10点を取ることは「限りなく0に近いので」とりあえず10用意する。  これは、絶対にやってはいけません。こういう事をやった時に限って、100年に一度しか無い、11対15なんてスコアに巡り会うことになります。(迷信のようだというなかれ。マーフィーの法則として知られる法則群の一つです。限りなく0%に近い確率で起こることは、何れ、必ず、そして最悪のタイミングで発生すると言います。)  さて、全部をテーブル化しようとすると、スペースにも限りが有るので、考え方の一つを紹介しておきます。  まず、属性がいろいろと出ていますが、その属性が、「何に依存するものなのか?」を考えます。言い換えると、何が決まれば、その属性を特定することが出来るかです。  例えば、ホームチームの1ゲームの得点で有れば、開催日と開催場所が決まれば、必ず特定できますね。(もし、有るチームの試合に対して「だけ」のデータであれば、開催場所は不要です。)  この組み合わせで特定できる属性の他の例は、ホーム・アウェイの各チームの監督名とか、主審名とか、1ゲーム全体に関わる属性群となります。  さて、有るゴールの得点者は、何に依存しているでしょう?開催日と開催場所と、発生時間(試合開始からのタイム)となります。  さて、こうやって、全部の属性が、何に依存しているかを整理してみましょう。  こうやって作業していった時に、「開催日と開催場所」とか、「開催日と開催場所と、発生時間」とかいった有る事象を特定するためのキーになる物を主キーとします。  そして、主キーに依存しているものを全て、テーブルの項目としてテーブル内に格納します。  (こうすれば、ゴール1・ゴール2・・・・なんて項目にはならないはずです。ある特定の時間に発生するゴールは絶対に1つだからです。)  考え方によっては、「開催日と開催場所、発生時間」の組で特定できるものが他にもあります。警告や反則の発生です。これも、ゴールと同じテーブルに入れることが出来ます。ただし、この場合は、この時間に何が起こったのかを記録するフィールドがひとつ必要になります。その代わり、ゴールも警告も反則もとにかく、ゲーム中に発生したイベントは全てこのテーブルに格納できます。    ここで注意するのは、どちらのチームで発生したのか(どちらのチームの得点になったか)は、記録の必要はありません。選手名が解れば、各チームの選手リストを登録してあるテーブルから調べられますからね。    むやみにテーブルを増やす必要はありませんが、テーブルを分けるのを怖がってはいけません。事象を特定するためのキーが異なる時は、あっさりとテーブルを分けましょう。  この作業を、「正規化」と言います。(かなり作業を簡略化しています。ここまでを正しくやれば、第2正規化と言われる部分までの作業が終わるはずです。「ここで注意するのは」の項が見落としなく配慮出来れば、第3正規化まで終わるはずです。普通は、ここまで出来れば、よしとされます。)  データベースのテーブル設計をする時には、避けて通れない作業ですから、根気よくやってみてください。この作業が正しく出来れば、次にデータベースを使うアプリケーションを作るのが、ぐっと楽になります。  頑張ってくださいね。

KEISUKE1151
質問者

お礼

mitonekoさん 回答ありがとうございます。 また、御礼が遅くなってしまい申し訳ありません。 正規化について丁寧に説明して頂きありがとうございます。 やはり素人が簡単に出来ることではないですね。 ここまで何となくで進めてきて、理想の結果を出すことができていたのでろくに勉強もしていませんでしたが。 もう少しデータベースの設計について勉強してみます。 ありがとうございました。

その他の回答 (1)

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.1

データベースの設計理論は重複データの廃棄と配列の廃止です。 よって、1レコード上に10個持つことはご法度です。 datadating(開催日) | goal_1_min(得点時間) |goal_1(得点者) というテーブルを作りましょう。 ・「限りなく0に近い」・・・あったら破綻しますよ。 ・今日、田中くんの得点は?という時に縦並びのほうが検索しやすい。 ・配列定義できないものを検索すると、10個を探しまわることになる。

KEISUKE1151
質問者

お礼

maiko0318さん 回答ありがとうございます。 また、御礼が遅くなってしまい申し訳ありません。 テーブルの構造についてご教示頂きありがとうございます。 ただやはり私のやり方だとホーム側とアウェー側でテーブルで分けている為、検索する時にどちらに所属している選手かを判断するのが難しそうですね。いちいち選手名で照会するわけにはいきませんし。 自チームと相手チームの得点者というテーブルで分ける必要があるかもしれません。 再度設計について考えてみます。 大変勉強になりました。 ありがとうございました。

関連するQ&A

  • Mysqlを使用した構造

    現在試合結果ページを作成しています。 参考サイト:http://www.so-net.ne.jp/antlers/games/484 上記が参考サイトであり、各表組み(レイアウト)は完成しています。 マッチレビューから下は作っていませんので省きます。 残りは上から順にスコア、得点者、各詳細(シュートの本数など)、警告者、メンバー(スタメンとサブ)。 Mysqlにて1.試合日程 2.試合結果のテーブルを作りました。 テーブル内の構図は 1.試合日程のテーブル id、日付、対戦相手、場所など 2.試合結果のテーブル id、試合日程id、得点、失点、各詳細 を作りました。 ここからが困っており、得点者、警告者、メンバー(スタメンとサブ)の構図なんですが、 各項目ごとにテーブルを作った方がよいのか、試合結果テーブルに入れた方がよいのか迷っています。 自分が考えていたのは 3.得点者テーブル id、試合結果id、ホームの得点者、アウェイの得点 4.警告者テーブル id、試合結果id、ホームの警告者、アウェイの警告者 5.メンバー(スタメンとサブ)のテーブル id、試合結果id、ホームのスタメン、ホームのサブ、アウェイのスタメン、アウェイのサブ として作ることを考えていたのですが、いかがでしょうか? 一番効率がよく早く出来る方法を教えていただけないでしょうか? 宜しくお願いします。

  • 条件によって抽出するデータを変える

    PHPやMySQLの勉強を兼ねてサッカーチームの試合データをテーブルに格納しました。 テーブルは下記のようにしました。他にもフィールドはありますがとりあえず3つのみ。 左からホームゲーム(H)かアウェーゲーム(A)か。ホームチームの得点。アウェーチームの得点です。 table名:gamedata h_a(VARCHAR型)|home_score(INT型)|away_score(INT型) H|5|3 A|2|1 A|3|4 このようなテーブルから「2得点以上5得点未満の試合」を抽出したい場合はどのようなSQL文になるのでしょか? 上記のテーブルだと「A|3|4」このデータだけ抽出されることになります。 問題点だと思うのは下記の二つ。 一つはホームゲームの場合は「home_score」に得点が格納されていますが、アウェーゲームの場合は「away_score」に得点が格納されていることになります。 二つ目はデータがまだ不十分で得点が何も入力されていないデータもあるという点です。こういうデータはスルーしたいです。 ご存知の方いらっしゃいましたらご教示ください。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • MySQL更新

    サッカー選手の出場時間やゴール数をデータベースに格納しています。 これまでは試合の度にphpMyAdminを利用して直接入力していたのですが、もっと簡単に更新作業が出来ないかと更新フォームを作成しデータを更新しようと考えています。 下記サイトを見て他のテーブルの更新は出来たのですが、この選手テーブルの更新をどうすればいいのか分かりません。 http://ponk.jp/php/basic/php_mysql#page_index4 テーブル名:active_player2 last_name(VARCHAR型)|goal(INT型)|comeout_time(INT型) 加藤|5|180 田中|3|270 佐藤|0|235 やりたい事は二点あります。 二点ともポジション別に全選手をずらっと並べ(チェックボックス)、対象選手にチェックを入れて更新ボタンをクリックしたら予め決めている数字を今の数字に加えて格納したいです。 (1)得点を挙げた選手 得点を挙げた選手にチェックを入れて更新ボタンを押すと、チェックを入れた選手のgoalに「1」が追加される。 (2)フル出場した選手 サッカーの場合、一試合で三人まで交代できるので少なくとも8選手はフル出場することになります。 そこでフル出場した8選手にチェックを入れて更新ボタンをを押すとその選手のcomeout_timeに「90」が追加される。 現在のコードは下記のようになっています。 player-update.htmlにフォームを設け、player-update2.htmlでデータを更新しようと考えています。 <?php function pt_set($pt,$checbox_name){ global $dbh; $sql = 'SELECT * FROM active_player2 WHERE position LIKE "%'.$pt.'%"'; foreach ($dbh->query($sql) as $row) { print '<input type="checkbox" name="'.$checbox_name.'" value="'.$row['last_name'].'">'.$row['last_name'].'</label>'; } return; } ?> <form action="player-update2.html" method="post"> <table> <tr> <th width="170">得点者</th> <td colspan="3"><p>DF</p> <?php pt_set("DF","goal"); ?> <p>MF</p> <?php pt_set("MF","goal"); ?> <p>FW</p> <?php pt_set("FW","goal"); ?> </td> </tr> <tr> <th width="170">フル出場</th> <td colspan="3"><p>GK</p> <?php pt_set("GK","full"); ?> <p>DF</p> <?php pt_set("DF","full"); ?> <p>MF</p> <?php pt_set("MF","full"); ?> <p>FW</p> <?php pt_set("FW","full"); ?> </td> </tr> </table> <input type="submit" value="更新する" style="width:300px;height:40px"> </form> これをplayer-update2.htmlに送信して、どのようにデータを追加すればいいのか分かりません。 ご存知の方いらっしゃいましたらご教示ください。 よろしくお願いします。

    • 締切済み
    • PHP
  • mysql 検索方法

    現在、mysqlの検索方法で悩んでいます。一番スマートな方法を教えていただけたらありがたいです。 内容)巨人一軍と巨人二軍の各試合結果を格納しているテーブルがあります。ここから、2011年の巨人二軍の勝敗を集計する。 テールブル) ■チームテーブル(id,チーム名) 1,巨人一軍|2,巨人二軍|3,・・・とデータが入っている。尚、idはプライマリーキー ■試合結果テーブル(r_id,自チームid、相手チーム、自チーム得点、相手チーム得点、試合年月日) 1,1,阪神一軍,2,3,2011-05-01|2,1,阪神一軍,5,10,2011-06-01|3,2,広島二軍,1,0,2011-05-02|・・・とデータが入っている。尚r_idはプライマリーキー このデータベースから2011年の巨人二軍の勝敗(○勝□敗)及び勝率(0.55等)をスマートに算出するには、どう行いますか? mysql 5.0.75-0 ubuntu Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.6

    • ベストアンサー
    • MySQL
  • 試合ごとの出場選手の一覧

    さまざまな国にクラブチームがありますが、それらの試合ごとに出場選手が一覧でわかるデータベースのようなものはありませんか? 第何節のどのチームのスタメンが誰で、途中出場が誰で、得点者が誰で、といったものを知りたいのですが。 インターネットの無料サービスなどないでしょうか。

  • 点が入りやすい試合と入りにくい試合の違いは?

    野球の試合だと 0対1、2対1等の点がなかなか入らない試合もあれば、 両チームが5点10点と点を取り合う試合もあります。 この差はなんなのでしょうか? 一方的に点を取られるケースは、調子が悪かったのかなどと思います。 しかし例えば4/16の巨人対ヤクルトの試合、 巨:0 2 0 0 3 0 0 0 3 1 計9 ヤ:1 2 0 0 0 0 0 4 1 0 計8 4回も逆転が起き、結果一点差…。そういう試合はしばしば見かけます。 4/12のロッテ対楽天。 楽天17点、ロッテ10点。10点とっても勝てないのかと思ってしまいます。 また、同じチームとの対戦でも、点が入らなかった試合の翌日は乱打戦になる事もあり、なぜそんなに違うの?と思うこともあります。「昨日そのヒットを2本打ってれば」とか考えても仕方がないことを思うこともあります。 点が入りやすい試合と入りにくい試合の違いはあるのでしょうか? 例えば… 3連戦の初日は入りにくいとか3日目だと入りやすいとか、 相手が弱いピッチャーを出してくる時には弱いピッチャーをぶつけることが多いからとか、 もしくは天候や球場といった外部要因が大きく影響しているのか 点を取られると奮起して取り返そうとするからなのか、 それとも本当にたまたまなのか…。 野球は少し見ますが、詳しくないのでよくわかりません。知っている選手は何人かいますが、誰が調子がいいとかスタメンが多い選手とかは全く分かりません。 すべてのケースに当てはまる要因など無いとは思いますが、よくある要因、影響が大きそうだと思われる要因をいくつか挙げていただけるとうれしいです。 野球に詳しい方、よろしくお願いします。

  • 現在データベースの勉強を独学で勉強しているのですが

    質問すべき場所が適合していなければ申し訳ありません。 データベースの勉強を最近始めたのですが、以下のような問いがあり、それに対してどのような回答をすればいいのかわかりません。 是非教えていただきたく思います。 また、データベースの勉強を一から始めるにあたってどのように勉強していくのがいいのか教えていただけたら幸いです ― 問 ― バスケットボールのリーグ戦における1シーズンのデータを取るために、次の関係スキーマXとYに基づく2つの関係表を持つ関係データベースを考える。 ・選手の所属チーム情報 X (氏名、所属チーム) ・試合における得点情報 Y (氏名、所属チーム、相手チーム、得点時間) ただし、関係データベースは次の条件を満たす。 ・同じ対戦相手とは一度だけ試合をする。 ・データベース中の選手とチームは名前により一意に識別される。 ・試合の得点は得点した選手の所属チームに対し、すべて2ポイント与えられ、3ポイントやフリースロー等による1ポイントの得点はないものとする。 ・選手はシーズン中に移籍により、複数のチームに所属することがある。 ・得点開始時間は試合開始から経過時間を分単位で記録し、同じ対戦カードで同一の時間帯には複数の得点者はいないこととする。 ・どのチームにも複数の選手が所属している。 このようにデータが与えられている場合に以下の情報を求める方針を関係代数を用いて式として表せ。 また、関係代数の利用可能な演算は集合演算(和、差、積、商)、選択、直積、射影がある。 1)複数のチームに所属した選手 2)Aというチームから得点を取られたことのないチーム 3)少なくとも一試合で15分以降に得点したチーム 4)所属したことのある全ての選手がシーズンを通して得点を取ったことのないチーム

  • MySQLデータベースについて

    データベースについて詳しい方にお聞きしたい事があります。 初心者なので書いている内容におかしな点もあるかと思いますが、よろしくお願いします。 5年ほど前のJavaを習っていて、簡単なデータベースを作ったことはあります。 □現在、会社が違うレンタルサーバーを一つずつ借りています。 A社のサーバー上で作成したデータベースをB社のサーバー上に公開しているサイトから呼び出し、テーブルを一覧表示できるのでしょうか? □初心者がデータベースを作成するにはphpMyAdminを使用するのが一番良いでしょうか? 使い方を検索してみたらちょっと難しそうですね。 Javaでデータベースの勉強をしていた時はあらかじめ作ったフォームにデータを入力していくだけだったので、同じような感じのシステムはないかなと思いました。 □現在使用しているサーバーはMySQLが5つ使えると書いています。 既にWordPressでブログ開設していて4つ使用しています。残りは一つ。 野球チームのデータベースを作成しようと思っているのですが、これまでの試合の記録のデータ、これまでの選手のデータのデータベースを作成したいと思っています。 MySQLは残り一つですが、この二つのデータベースを作る事は可能なのでしょうか?二つ必要ですか? □スマホのサイトも作成しているんですが、PCサイトと同様にデータベースに接続し、一覧表示できるのでしょうか? スマホでPHPが使えるのかなと思ったので。 ご存知の方いらっしゃいましたらご教示ください。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • Jリーグの地方開催について

    素朴な疑問なのですが、Jリーグの試合で、ホームチームもアウェイチームもまったく関係ない地域で試合を開催し、さらにホーム側とかアウェイ側とかを決めている意味がまったく分かりません。 たとえば、9/12(土)は鹿児島県でFC東京VS京都サンガが開催されますが、その試合では京都サンガのホームゲームとのことです。 まったく意味が分からないのですが、このような事をあえてサッカー協会が実施するのはどういう意図があるのか? また、ホームとかアウェイという概念は誰がどうやって決めているのか? もし分かる方がいれば教えて頂ければ幸いです。

  • 洗礼

    スポーツに、サッカーに疎いので教えてください。 日本対ヨルダンのサッカーの試合結果がニュースになっています。 アウェーの洗礼……とテロップで表現されています。 レーザー光線はフェアじゃない、と感じますが、洗礼と言う表現はひっかかります。 むかし昔、ドーハの悲劇と呼ばれた試合もありましたね。 ロスタイムと言え、相手チームに得点取られた事に悲劇とは!? 昨日の試合に対しコメンテーターとして出演されている元サッカー選手も「俺らの時にもドーハの悲劇があった」なんて発言をしています。 聞いてるこちらはなんだか神がかった表現に思え……何を悲劇的に語るのかわかりません。 わたしは洗礼や悲劇と言う表現に違和感あるのですが、皆さんはどうですか?教えてください。