Jest tu kilka pytań/problemów, więc postaram się odpowiedzieć na każde z nich.
Wszystkie interakcje w turnieju powinny być w czasie rzeczywistym/odzwierciedlane dla wielu użytkowników.
W przypadku małego lub średniego ruchu w Twojej witrynie może to nie stanowić problemu. W przypadku większego natężenia ruchu szybko stanie się to poważnym problemem.
Rozważ jako przykład, jak często chcesz odpytywać bazę danych za pomocą wywołań AJAX. Każda sekunda? Więc jeśli masz 100 osób z otwartą stroną, masz 100 połączeń z bazą danych na sekundę? Przekonasz się, że to szybko zabije Twoją bazę danych.
Mimo że jest to nieco nie na temat, zdecydowanie zalecam wcześniejsze zbadanie, jak buforować wyniki turniejów. Możesz buforować statystyki itp. i pozwolić im wygasnąć lub wygasnąć je proaktywnie, ale zdecydowanie poświęć trochę czasu na ich badanie.
Statystyki/wyniki w czasie rzeczywistym
Pamiętaj, że łączenie w relacyjnych bazach danych zajmuje trochę czasu. Jeśli mocno znormalizujesz strukturę turnieju, uzyskanie statystyk może być bolesne. Najtrudniejszą częścią systemu do osiągnięcia efektywności będą zestawienia i statystyki z każdego turnieju.
Projektując bazę danych/tabele/widoki/procedury składowane, pamiętaj o ostatecznym celu – szybkim uzyskiwaniu statystyk. Może to oznaczać nie zbytnie normalizowanie danych (aby uniknąć zbyt wielu złączeń). Może to również oznaczać zwrócenie szczególnej uwagi na typy danych — na przykład używanie bitów/skrótów/itd. zamiast liczb całkowitych.
Jak modelować różne typy turniejów
Nie znam się na modelach turniejowych, ale mam konkretne porady dotyczące modelowania. =)
Kilka pytań, które powinieneś sobie zadać:
-
Czy wszystkie turnieje mają wspólne pola? Innymi słowy, na turniej round robin przechowujemy 10 pól. Na turniej z pojedynczą eliminacją przechowujemy 11 pól. Jeśli współdzielą te same 10 pól, sugerowałbym umieszczenie wszystkich typów turniejów w jednej tabeli, a następnie użycie pola turniej_typ, aby określić typ turnieju dla Twojej aplikacji.
-
Czy wszystkie turnieje nie mają wspólnych pól? Ustaw je na osobnych stołach - po jednym dla każdego typu turnieju. Możesz utworzyć jedną tabelę dla współdzielonych danych, ale potem mieć różne tabele dla określonych informacji.
-
Czy pola turniejowe będą się z czasem rozrastać? ? Z czasem będziesz chciał dodawać pola do typów turniejów. Jeśli przewidujesz, że z czasem turnieje staną się bardzo wyjątkowe i bardzo specyficzne, rozdziel je. W przeciwnym razie otrzymasz wiele pól, które zawierają mnóstwo wartości NULL.
-
Czy rozważałeś rozwiązanie NoSQL? ? Zaletą sklepu NoSQL jest to, że denormalizuje dane, dzięki czemu nie ma łączeń. Możesz także mieć niejednorodne (różne typy danych) w tej samej „tabeli” lub kontenerze. Po prostu coś do rozważenia, ponieważ może to znacznie ułatwić ci życie. Sprawdź MongoDB jako przykład.