Hier gibt es mehrere Fragen/Probleme, daher werde ich versuchen, auf alle einzugehen.
Alle Turnierinteraktionen sollten in Echtzeit erfolgen/für viele Benutzer reflektiert werden.
Bei geringem bis mittlerem Traffic auf Ihrer Website ist dies möglicherweise kein Problem. Bei stärkerem Verkehr wird dies schnell zu einem großen Problem.
Betrachten Sie als Beispiel, wie oft Sie die Datenbank mit Ihren AJAX-Aufrufen abfragen möchten. Jede Sekunde? Wenn Sie also 100 Personen mit einer geöffneten Seite haben, haben Sie 100 Datenbankaufrufe pro Sekunde? Sie werden feststellen, dass dies Ihre Datenbank schnell zerstören wird.
Auch wenn dies etwas vom Thema abweicht, würde ich dringend empfehlen, im Voraus zu untersuchen, wie Turnierergebnisse zwischengespeichert werden können. Sie können die Statistiken usw. zwischenspeichern und entweder ablaufen lassen oder proaktiv ablaufen lassen, aber verbringen Sie auf jeden Fall etwas Zeit mit der Recherche.
Statistiken/Ergebnisse in Echtzeit
Beachten Sie, dass Verknüpfungen in relationalen Datenbanken Zeit in Anspruch nehmen. Wenn Sie Ihre Turnierstruktur stark normalisieren, kann es schmerzhaft sein, Statistiken zu erhalten. Der am schwierigsten zu gestaltende Teil des Systems werden die Aggregate und Statistiken von jedem Turnier sein.
Denken Sie beim Entwerfen Ihrer Datenbank/Tabellen/Ansichten/gespeicherten Prozeduren an das Endziel – schnell Statistiken zu erhalten. Dies könnte nicht bedeuten die Daten zu stark normalisieren (um zu viele Verknüpfungen zu vermeiden). Es kann auch bedeuten, sehr genau auf Ihre Datentypen zu achten - zum Beispiel mit Bits/Shorts/etc. statt Ganzzahlen.
So modellieren Sie die verschiedenen Turniertypen
Ich bin mit Turniermodellen nicht vertraut, aber ich habe spezifische Ratschläge zum Modellieren. =)
Einige Fragen, die Sie sich stellen sollten:
-
Haben alle Turniere gemeinsame Felder? Mit anderen Worten, für ein Round-Robin-Turnier speichern wir 10 Felder. Für ein Single-Elimination-Turnier speichern wir 11 Felder. Wenn sie die gleichen 10 Felder teilen, würde ich empfehlen, alle Turniertypen in einer Tabelle zusammenzufassen und dann ein turnier_type-Feld zu verwenden, um den Turniertyp für Ihre Anwendung zu bestimmen.
-
Haben nicht alle Turniere gemeinsame Felder? Machen Sie sie zu separaten Tischen – einen pro Turniertyp. Sie können eine Tabelle für gemeinsam genutzte Daten erstellen, aber dann verschiedene Tabellen für spezifische Informationen verwenden.
-
Werden Turnierfelder mit der Zeit auseinander wachsen ? Im Laufe der Zeit werden Sie Turniertypen Felder hinzufügen wollen. Wenn Sie davon ausgehen, dass die Turniere im Laufe der Zeit sehr einzigartig und sehr spezifisch werden, machen Sie sie getrennt. Andernfalls erhalten Sie am Ende viele Felder mit Tonnen von NULL-Werten.
-
Haben Sie eine NoSQL-Lösung in Erwägung gezogen ? Das Schöne an einem NoSQL-Speicher ist, dass er die Daten denormalisiert, sodass Sie keine Joins haben. Sie können auch heterogene (unterschiedliche Arten von Daten) in derselben „Tabelle“ oder demselben Container haben. Nur etwas zu überlegen, weil es Ihr Leben erheblich erleichtern könnte. Sehen Sie sich MongoDB als Beispiel an.