トーナメントデータベースを設計する最良の方法


13

今後のユーロ2012サッカートーナメントのすべての試合に賭けをするためのウェブページを作成しています。ノックアウトフェーズでどのアプローチを採用するかを決めるのに、助けが必要です。

以下のモックアップを作成しました。これは、すべての「既知の」グループステージマッチの結果を保存することにかなり満足しています。この設計により、ユーザーが正しい賭けをしたかどうかを非常に簡単に確認できます。

しかし、四半期および準決勝を保存する最良の方法は何ですか?これらの試合は、グループステージでの結果に依存します。

私が考えたアプローチの1つは、matchesテーブルにすべての試合を追加することでしたが、ノックアウトフェーズでの試合のために異なる変数または識別子をホーム/アウェイチームに割り当てました。そして、それらの識別子がチームにマッピングされた他のテーブルを用意します...

基本的なデータベース設計


MySQLを使用することで解決するのか、それとも代替案を受け入れるのですか?
ジャックはtopanswers.xyz

かなり落ち着きました。MySQLで知っておくべき利点/欠点はありますか?
ハンプソフルソン

チェック制約は強制されません。一般に、DRIで制約を実施するためのオプションは少なくなりますが、それが重要かどうかはアプリケーションに大きく依存します。ハッピーにするチャットあなたはより多くの意見を:)したい場合
ジャックはtopanswers.xyz試し言う

ありがたいことに、私はあまり慣れていないので、とにかく制約を使用するとは思わない。それはDBに送られる前それをシンプルに保つこと、自分のアプリケーション内のすべてのデータを検証する
hampusohlsson

よかった。それはもちろんデータベースではよりシンプルですがそれはまったく別の会話です;)
ジャックはtopanswers.xyzを試す

回答:


3

私は、モデル自体のすべての事前定義された情報を修正しようとすることから始めます

  • 日付/会場
  • 構造(グループ/ノックアウトステージ)
  • ルール(つまり、得点、タイブレークルール)

この情報の一部はテーブル内のデータになり、一部はビュー内の体系化されたロジックになります。

おそらくこのようなもの:

  • team(team_id、group_code enum( 'A'、 'B'、 'C​​'、 'D')、name)
  • match(match_id、kickoff_at)
  • group_match(match_id、team_id_home、team_id_away、group_code)
  • knockout_match(match_id、knockout_code enum( 'Q1'、 'Q2'、 'Q3'、 'Q4'、 'S1'、 'S2'、 'F')
  • result(match_id、score_home、score_away)

Q1でどのチームがプレーするかなどの情報は、グループステージの結果から計算できるため、直接保存する必要はありません。唯一のトーナメントの進行がに挿入されるようにするために変更resultテーブル。


3

チームIDを使用するのが正しい方法だと思います。すべての決勝ラウンドのもう1つの抽象化レベルでは、不必要な複雑さが追加されるだけで、マッチテーブルにデータをプリロードする以外の利点はあまりありません。

これをサポートするために、データ構造はかなり堅実に見えます。最初の試合結果が入ったら、準々決勝と準決勝を試合テーブルに追加する必要があります。試合がランダムに割り当てられている場合、これは手動操作ですが、特定の順序であれば...

   A
match 1 -----+
   B         A
          match 5 -----+
   C         C         |
match 2 -----+         |
   D                   A
                    match 7
   E                   F
match 3 -----+         |
   F         F         |
          match 6 -----+
   G         G
match 4 -----+
   H

...その後、クエリを使用してこれを行うことができます。繰り返しますが、クエリの複雑さは、チームの数によっては努力する価値がない場合があります


1

すべての一致をテーブル「matches」に保存することをお勧めします。ただし、後でメモリ内のテーブルを効率的にクエリするためにバイナリツリーを構築する必要があるため、追加のフィールド「ランキング」を追加します。これは古典的なランキングアルゴリズムの問​​題であり、グレーコードトーナメントをグーグルで検索して詳細を確認したり、stackoverflowの履歴を確認したりできます。基本的に、トーナメントはバイナリツリーです。ここではグレイコードについての良い記事がある:http://villemin.gerard.free.fr/Wwwgvmm/Numerati/CodeGray.htm。残念ながら、それはフランス語です。:ここでは、ランキングからバイナリツリーを生成する方法であるhttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/229068を

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.