Ich spiele regelmäßig ein 2-gegen-2-Spiel mit 12 Freunden und möchte eine Datenbank, in der Spieler, Teams, Ergebnisse und Spiele erfasst werden, um ein Rangsystem zu erstellen.
Da wir regelmäßig Teams ändern Ich habe mit Tischen kommen players
, teams
und games
wo die Spiele zwei Teams haben (team1 und team2) und die Teams aus zwei Spielern (Spieler1 und player2).
Dies verursacht einige Probleme - wenn ich zum Beispiel zwei Spieler auswähle (nennen wir sie A und B ), um zusammen zu spielen, muss ich überprüfen, ob es bereits ein Team gibt, in dem Spieler1 A und Spieler2 B oder Spieler1 B und Spieler2 ist ist ein.
Die Spalten games
und wins
sind sowohl in der players
Tabelle als auch in der teams
Tabelle vorhanden - aber das liegt daran, dass ich sehen möchte, wie viele Spiele von den Spielern gewonnen werden, aber auch, wie kompatibel der Spieler in verschiedenen Teams ist (wie oft ein Spieler gewinnt, wenn er sich zusammenschließt ein anderer bestimmter Spieler).
- Rangliste (ich werde wahrscheinlich das Elo-Bewertungssystem verwenden )
- Eine Statistikseite für jeden Spieler mit Bewertungen, Gewinnen, Spielen, Statistiken der letzten Spiele und den Spielern, mit denen er am besten kompatibel ist.
Ich vermute sehr, dass ein Großteil davon gegen einige der Prinzipien der Datenbanknormalisierung verstößt, und ich würde gerne einige Vorschläge zur Implementierung meines Datenbankdesigns erhalten.
quelle
Antworten:
Es gibt zwei Probleme, die ich bei Ihrem aktuellen Schema sehe: Zum einen müssen zwei Felder in einer Tabelle überprüft werden, um festzustellen, ob ein zusammengesetzter Schlüssel tatsächlich ein Duplikat ist, und einige aggregierte Daten werden zur getrennten Ausführung in die einzelnen Tabellen zusammengefasst Entitäten (gewinnt insbesondere, aber möglicherweise auch die Bewertung eines Spielers).
In der ersten Ausgabe gibt es keine In-DB-Tricks, mit denen Sie jedes Feld eines zusammengesetzten Schlüssels so behandeln können, wie Sie es möchten. Wenn Ihre DB dies jedoch unterstützt, können Sie eine Funktion
getPlayerTeams(player_id)
zum Einkapseln erstellen die Abfrage.(Sie können auch eine Ansicht mit dem team_thumbprint erstellen, der als Hash der sortierten Spieler-IDs berechnet wird, sodass jede Kombination derselben zwei Personen immer zum gleichen Fingerabdruck führt, aber das kann hier etwas viel sein).
Bei der Normalisierung sollten Sie Entitäten von den Ergebnissen trennen, die auftreten, indem Sie eine
team_result
Tabelle verwenden, um alle Ergebnisse für ein bestimmtes Team zu verfolgen. Eine etwas extremere Normalisierung würde auch einenplayer_rating_hist
Tisch erfordern, der alle Bewertungsänderungen für einen Spieler enthält. Ihre aktuelle Bewertung ist einfach die mit dem letzten Datum. Eine Player-Ansicht kann auch verwendet werden, um den neuesten Wert für eine einfache Abfrage zu enthalten.Vorgeschlagenes Schema (leider kein Diagramm):
Fragen:
Diese Struktur ermöglicht es, "Basis" -Entitäten (Spieler und Teams) von den "Inhalten" zu trennen, die aufgrund des Systemlaufs im Laufe der Zeit entstehen, und bedeutet, dass Sie eine der Basistabellen nicht ständig mit der aktuellen Bewertung # aktualisieren. von Gewinnen usw. Dies sind abgeleitete Werte und sollten abgerufen werden, indem die neueste Bewertung, die durchschnittliche Bewertung, die
COUNT
Gewinne oder Verluste usw. abgerufen werden . Wenn das System groß genug ist, können Sie in Betracht ziehen, solche aggregierten Daten in ein separates "Lager" zu extrahieren. (auch wenn es sich nur um einen separaten Satz von Tabellen in derselben Datenbank handelte) zur einfacheren Analyse.quelle