Der beste Weg, eine Turnierdatenbank zu entwerfen

13

Ich erstelle eine Webseite für Wetten auf alle Spiele des kommenden Fußballturniers der Euro 2012. Benötigen Sie Hilfe bei der Entscheidung, welchen Ansatz Sie für die Ko-Phase wählen möchten?

Ich habe unten ein Modell erstellt, mit dem ich ziemlich zufrieden bin, wenn es darum geht, die Ergebnisse aller "bekannten" Gruppenspiele zu speichern. Dieses Design macht es sehr einfach zu überprüfen, ob ein Benutzer einen korrekten Einsatz gemacht hat oder nicht.

Aber wie kann man das Viertelfinale und das Halbfinale am besten speichern? Diese Spiele hängen vom Ergebnis in der Gruppenphase ab.

Ein Ansatz, den ich mir überlegt habe, war, ALLE Spiele zur matchesTabelle hinzuzufügen , aber den Heim- / Auswärtsteams für die Spiele in der Ko-Phase unterschiedliche Variablen oder Kennungen zuzuweisen. Und dann haben Sie eine andere Tabelle mit diesen Bezeichnern, die Teams zugeordnet sind ... Dies könnte funktionieren, fühlt sich aber nicht richtig an.

Grundlegendes Datenbankdesign

Hampusohlsson
quelle
Sind Sie mit MySQL einverstanden oder offen für Alternativen?
Jack sagt, versuchen Sie topanswers.xyz
Ziemlich sicher. Gibt es Vor- / Nachteile von MySQL, die ich kennen sollte?
hampusohlsson
Überprüfungsbeschränkungen werden nicht erzwungen. Im Allgemeinen gibt es weniger Möglichkeiten, Einschränkungen mit DRI durchzusetzen. Ob dies für Sie von Bedeutung ist, hängt jedoch stark von Ihrer Anwendung ab.
Freut mich
Danke, aber ich glaube nicht, dass ich Einschränkungen verwenden würde, da ich damit nicht sehr vertraut bin. Überprüft alle Daten in meiner Bewerbung, bevor sie an die DB gesendet werden, um es einfach zu halten
hampusohlsson
Gut gut. In der DB ist es natürlich einfacher, aber das ist eine ganz andere Konversation ;)
Jack sagt, versuche topanswers.xyz

Antworten:

3

Zunächst würde ich versuchen, alle vorgegebenen Informationen im Modell selbst zu korrigieren, einschließlich

  • Daten / Orte
  • Struktur (dh Gruppen- / Ko-Phasen)
  • Regeln (dh Punktewertung, Gleichstandregeln)

Einige dieser Informationen sind Daten in Tabellen, andere sind codierte Logik in Ansichten.

So etwas vielleicht:

  • 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")
  • Ergebnis (match_id, score_home, score_away)

Informationen, die Teams im ersten Quartal spielen, müssen nie direkt gespeichert werden, da sie aus den Ergebnissen der Gruppenphase berechnet werden können. Die einzigen Änderungen, die im Verlauf des Turniers vorgenommen werden müssen, sind Einfügungen in die resultTabelle.

Jack sagt, versuchen Sie es mit topanswers.xyz
quelle
3

Ich denke, dass die Verwendung der Team-ID der richtige Weg ist. Eine weitere Abstraktionsebene für alle Endrunden fügt lediglich unnötige Komplexität hinzu, und zwar nur, wenn die Übereinstimmungstabelle mit Daten vorab geladen wird.

Die Datenstruktur sieht ziemlich solide aus, um dies zu unterstützen. Das Viertelfinale und das Halbfinale müssten der Spieltabelle hinzugefügt werden, sobald die ersten Spielergebnisse vorliegen. Wenn die Spiele nach dem Zufallsprinzip vergeben werden, ist dies ein manueller Vorgang, wenn sie sich jedoch in einer bestimmten Reihenfolge befinden ...

   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

... dann könnte dies möglicherweise mit einer Abfrage erfolgen. Auch hier ist die Komplexität der Abfrage je nach Anzahl der Teams den Aufwand möglicherweise nicht wert

Tevo D
quelle
1

Es ist eine gute Idee, alle Übereinstimmungen in der Tabelle "Übereinstimmungen" zu speichern. Ich würde jedoch ein zusätzliches Feld "Ranking" hinzufügen, da Sie später einen Binärbaum erstellen müssen, um die Tabelle im Speicher effizient abzufragen. Es ist ein klassisches Problem mit dem Ranking-Algorithmus. Weitere Informationen erhalten Sie, wenn Sie bei Google nach Gray-Code-Turnieren suchen oder in meinem Stackoverflow-Verlauf nachsehen. Grundsätzlich ist ein Turnier ein binärer Baum. Hier ist ein guter Artikel über Gray Codes: http://villemin.gerard.free.fr/Wwwgvmm/Numerati/CodeGray.htm . Leider ist es französisch. So generieren Sie einen Binärbaum aus dem Ranking: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/229068 .

Gigamegs
quelle