20

NCAA 男子バスケットボール ブラケットを表すのに最適なデータベース スキーマは何ですか? 慣れていない場合は、次のリンクをご覧ください: http://www.cbssports.com/collegebasketball/mayhem/brackets/viewable_men

単一のテーブル、多数のテーブル、ハードコーディングされた列、やや動的な方法など、このデータをモデル化するいくつかの異なる方法を見ることができます。各チームのシードと場所の両方をモデル化する方法が必要です。ゲームとそれぞれの結果 (場合によってはスコア)。また、トーナメントのどの段階で誰が誰と対戦するかを表す方法も必要です。

マーチ・マッドネスの精神から、これは良い質問だと思いました。ここには明らかな答えがいくつかあります。この質問の主な目的は、あなたがそれに答えることができるさまざまな方法をすべて見ることです. どちらの方法が最適かは、使用している言語やそれをどのように正確に扱っているかによって主観的なものになる可能性がありますが、データベースにとらわれず、言語にとらわれず、かなり高いレベルの回答を維持するようにしてください。この質問をより適切に表現する方法、またはより適切に定義する方法について提案がある場合は、コメントでお知らせください。

4

8 に答える 8

6

RDBMS の場合、ほとんどの状況に対応できる柔軟性を備えた最も単純なアプローチは、次のようにすることだと思います。

  • チームには[team-id (PK)][name][region-id (FK to Regions )][initial-seed] があります。1チームにつき1回のエントリーとなります。(地域テーブルは、各 NCAA 地域に 1 つずつ、合計 4 つのエントリしかない単純なコード テーブルであり、ここには記載されていません。)

  • 参加者には[game-id (FK to Games )][team-id (FK to Teams )][score (nullable)][outcome]があります。[score]は、チームが没収される可能性があることを反映するために null 可能です。通常、ゲームごとに 2 人の参加者がいます。

  • ゲームには[game-id (PK)][date][location]があります。どのチームがゲームに参加したかを調べるには、参加者テーブルで適切なゲーム ID を検索します。(誰かが脱落または失格になった場合、2 つ以上のチームが存在する可能性があることに注意してください。)

初期ブラケットを設定するには、適切なシードを互いに一致させます。ゲームがプレイされるとき、どのチームが結果を持っているかに注意してください=特定のゲームの勝者。このチームは、別のゲームの勝者と対戦します。勝者チームがなくなるまでブラケットを埋める。

于 2009-03-16T12:40:53.067 に答える
2

次のテーブルを使用して小さなシステムを作成しました。

ゲーム: GameId、TournId、RoundId、Sequence、Date、VisitorId、VisitorScore、HomeId、HomeScore、WinnerId、WinnerGameId、WinnerHome (ビット)

予測: PredId、UserId、GameId、PredVisitorId、PredHomeId、PredWinnerId

ラウンド: RoundId、TournId、RoundNum、Heading1、Heading2

チーム: TeamId、TournId、TeamName、Seed、MoreInfo、Url

トーナメント: TournId、TournDesc

ユーザー: TournId、UserName

WinnerGameId は、ゲームの勝者を次のゲームに結び付けます。WinnerHome は、勝者がその次のゲームのホームかビジターかを示します。それ以外は、かなり自明だと思います。

于 2009-03-24T20:29:01.067 に答える
2

あなたは RDBMS を指定しなかったので、私は少し違って、今週末にそれについて読んでいたので、CouchDB アプローチを使用します。これが私が思いついたゲームを表す文書構造です。

{
  "round" : 1, //The final would be round 5, and I guess Alabama St. vs. Morehead would be 0
  "location" : "Dayton, OH",
  "division": "South",
  "teams" : ["UNC", "Radford"]  //A feature of Couch is that fields like teams don't need a fixed nuber of columns.
  "winner" : "UNC"  //Showing my bias
}

より興味深い、または完全なアプリケーションには、チーム、ランキングなどのデータもどこかに保存されている場合があります。ジョンのアプローチは、その角度をうまくカバーしているようです。私の Couch スキルをよく知っている人からのコメントを歓迎します。

于 2009-03-16T12:59:32.430 に答える
1

4つのテーブル:

チーム(チーム、地域、シード)

ユーザー(UserId、Eメール、blablabla)

ブラケット(BracketId、UserId、Points)

ピック(BracketId、GameId、Team、Points)

人が提出する各ブラケットには、ピックテーブルに63行が含まれます。
各ゲームがプレイされた後、個々のピックを獲得するためにピックテーブルを更新します。このテーブルのポイントフィールドは、まだプレイされていないゲームの場合はnull、間違ったピックの場合は0、正しいピックの場合は正の数になります。GameIdは、そのユーザーブラケットのどこにこのピックが入るかを識別するための単なるキーです(例:East_Round2_Game2、FinalFour_Game1)。

ブラケットテーブルのポイント列は、ピックテーブルを更新するたびに更新できるため、そのブラケットのポイントの合計が含まれます。最も注目されるのは順位です。誰かがリーダーボードを見たいと思うたびに順位を再開したくないのです。

実際にプレイされるすべてのゲームやその結果をテーブルに保持する必要はありません。各ゲームの後にピックテーブルを更新するだけです。ピックテーブルの[ポイント]列を確認するだけで、正しい/間違ったピックのブラケットの強調表示を行うこともできます。

于 2009-03-24T22:05:43.283 に答える
1

多数の異なるブラケット予測を追跡する場合: 各ゲームの結果を追跡するために 67 ビットを使用できます。(つまり、トーナメントで行われた 67 のゲームのそれぞれは、1 = 「チーム A の勝利」、0 = 「チーム B の勝利」というビットで表されます)。特定のブラケットを表示するには、非常に単純な関数を使用して 67 ビットを UI にマップできます。この関数は、チーム名とその最初の位置を認識し、「ビットボード」をトレースしながら、ブラケットを介してチームの動きを追跡します。

于 2014-01-22T16:11:27.950 に答える
-4

すべてのデータベースに同じスキーマを使用しています。

t
--------
1 guid PK
2 guid FK
3 bit

それから私のコードで:

select [2],[3] from t where [1] = @1

@ 1は、フェッチしているデータのIDです。次に、[2]がnullでない場合は、@1を[2]に設定して再度選択します。

これにより、投稿した状況を簡単にモデル化できます。

于 2009-03-26T02:31:48.953 に答える