Regularnie gram w grę 2 na 2 z 12 przyjaciółmi i chcę, aby baza danych śledziła graczy, zespoły, wyniki i gry z zamiarem stworzenia systemu rankingowego.
Ponieważ regularnie zmieniać zespoły Doszedłem z tabel players
, teams
a games
gdzie gry mają dwa zespoły (TEAM1 i team2) oraz zespoły składają się z dwóch graczy (Gracz1 i player2).
Powoduje to sporo problemów - na przykład, jeśli wybiorę dwóch graczy (nazwijmy ich A i B ) do wspólnej gry, muszę sprawdzić, czy istnieje już drużyna, w której Gracz 1 to A, a Gracz 2 to B lub Gracz 1 to B i Gracz 2 jest.
Kolumny games
i wins
są obecne zarówno na players
stole, jak i na teams
stole - ale dzieje się tak, ponieważ chcę zobaczyć zarówno liczbę gier wygranych przez graczy, ale także zgodność gracza w różnych drużynach (jak często gracz wygrywa, gdy współpracuje z inny konkretny gracz).
- Tabela wyników (prawdopodobnie użyję systemu oceny Elo )
- Strona statystyk dla każdego gracza z oceną, wygranymi, grami, statystykami ostatnich gier i z którymi graczami jest najbardziej kompatybilny.
Podejrzewam, że duża część tego narusza niektóre zasady normalizacji bazy danych, i chciałbym uzyskać sugestie dotyczące sposobu wdrożenia projektu bazy danych.
źródło
Odpowiedzi:
Są dwa problemy, które widzę w twoim bieżącym schemacie, jeden to problem polegający na sprawdzeniu dwóch pól w tabeli, aby ustalić, czy klucz złożony jest faktycznie duplikatem, a niektóre agregowane dane są zrolowane do poszczególnych tabel dla osobnych podmioty (szczególnie wygrane, ale także potencjalnie ocena gracza).
W przypadku pierwszego problemu nie ma żadnych sztuczek w bazie danych, dzięki którym jedno / dowolne pole klucza złożonego będzie traktowane w sposób LUB, którego szukasz, ale jeśli twoja baza danych obsługuje to, możesz utworzyć funkcję
getPlayerTeams(player_id)
do enkapsulacji Zapytanie.(Możesz również utworzyć widok z odciskiem team_thumb obliczonym jako skrót sortowanych identyfikatorów graczy, aby każda kombinacja tych samych dwóch osób zawsze dawała ten sam odcisk palca, ale tutaj może być trochę więcej).
Jeśli chodzi o normalizację, rozważ oddzielenie bytów od wyników, które występują, używając
team_result
tabeli do śledzenia wszystkich wyników dla danego zespołu. Nieco bardziej ekstremalna normalizacja wymagałaby równieżplayer_rating_hist
stołu zawierającego wszystkie zmiany oceny dla gracza. Ich obecna ocena to po prostu najnowsza data. Widok odtwarzacza można również wykorzystać do zawarcia najnowszej wartości w celu łatwego zapytania.Proponowany schemat (przepraszam, brak schematu):
Zapytania:
Ta struktura pozwala oddzielić podmioty „podstawowe” (graczy i drużyny) od „treści”, które pojawiają się w wyniku działania systemu w czasie, i oznacza, że nie aktualizujesz stale jednej z tabel podstawowych o bieżącej ocenie, # wygranych itp. Są to wartości pochodne i należy je pobrać, uzyskując najnowszą ocenę, średnią ocenę
COUNT
wygranych lub strat itp. Jeśli system jest wystarczająco duży, możesz rozważyć wyodrębnienie takich zagregowanych danych do osobnego „magazynu” (nawet jeśli był to tylko oddzielny zestaw tabel w tej samej bazie danych) dla łatwiejszej analizy.źródło