Najlepszy sposób na zaprojektowanie bazy danych turniejów

13

Tworzę stronę internetową, na której można obstawiać zakłady na wszystkie mecze nadchodzącego turnieju piłkarskiego Euro 2012. Potrzebujesz pomocy przy podejmowaniu decyzji o podejściu do fazy pucharowej.

Poniżej utworzyłem makietę, z której jestem bardzo zadowolony, jeśli chodzi o przechowywanie wyników wszystkich „znanych” meczów fazy grupowej. Ta konstrukcja bardzo ułatwia sprawdzenie, czy użytkownik postawił prawidłowy zakład, czy nie.

Ale jaki jest najlepszy sposób na przechowywanie ćwierćfinałów i półfinałów? Te mecze zależą od wyniku w fazie grupowej.

Jednym podejściem, o którym myślałem, było dodanie WSZYSTKICH meczów do matchestabeli, ale przypisanie różnych zmiennych lub identyfikatorów drużynom gospodarzy / gości na mecze w fazie pucharowej. A potem przygotuj inną tabelę z tymi identyfikatorami zmapowanymi do zespołów ... To może działać, ale nie wydaje się właściwe.

Podstawowy projekt bazy danych

hampusohlsson
źródło
Czy korzystasz z MySQL lub jesteś otwarty na alternatywy?
Jack mówi, że spróbuj topanswers.xyz 15.11.11
Prawie ustalone .. Czy są jakieś zalety / wady MySQL, o których powinienem wiedzieć?
hampusohlsson
Sprawdź ograniczenia nie są egzekwowane. Ogólnie mniej opcji wymuszania ograniczeń za pomocą DRI - ale to, czy jest to dla Ciebie ważne, zależy w dużej mierze od Twojej aplikacji. Chętnie porozmawiać , jeśli chcesz więcej opinii :)
Jack mówi spróbować topanswers.xyz
Dzięki, ale nie sądzę, że i tak użyłbym ograniczeń, ponieważ nie znam się na tym zbyt dobrze. Sprawdzę poprawność wszystkich danych w mojej aplikacji, zanim zostaną one wysłane do bazy danych, utrzymując prostotę
hampusohlsson
Dobrze dobrze. Oczywiście w DB jest to prostsze, ale to zupełnie inna rozmowa ;)
Jack mówi, że spróbuj topanswers.xyz

Odpowiedzi:

3

Zacznę od próby naprawienia wszystkich z góry określonych informacji w samym modelu, w tym

  • daty / miejsca
  • struktura (tj. etapy grupowe / nokautowe)
  • zasady (tj. zdobywanie punktów, zasady rozstrzygania remisów)

Niektóre z tych informacji będą danymi w tabelach, niektóre będą logiką skodyfikowaną w widokach.

Może coś takiego:

  • zespół (identyfikator_grupy, wyliczenie kodu_grupy („A”, „B”, „C”, „D”), nazwa)
  • 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”)
  • wynik (match_id, score_home, score_away)

Informacje takie, które drużyny grają w Q1, nigdy nie muszą być przechowywane bezpośrednio, ponieważ można je obliczyć na podstawie wyników fazy grupowej. Że tylko zmiany, aby jak postępy jego turniejowe są wkładki do resultstołu.

Jack mówi, że spróbuj topanswers.xyz
źródło
3

Myślę, że używanie identyfikatora zespołu jest właściwą drogą. Kolejny poziom abstrakcji dla wszystkich rund finałowych dodaje niepotrzebnej złożoności, nie dając wiele korzyści poza wstępnym załadowaniem tabeli meczów danymi.

Struktura danych wygląda na dość solidną, aby to obsługiwać. Ćwierćfinał i półfinały będą musiały zostać dodane do tabeli meczów, gdy tylko pojawią się początkowe wyniki meczu. Jeśli mecze są przydzielane losowo, jest to operacja ręczna, jednak jeśli są w określonej kolejności ...

   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

... wtedy można to zrobić za pomocą zapytania. Ponownie, złożoność zapytania może nie być warta wysiłku w zależności od liczby zespołów

Tevo D.
źródło
1

Dobrze jest przechowywać wszystkie dopasowania w tabeli „mecze”. Dodałbym jednak do niego dodatkowe pole „ranking”, ponieważ później potrzebujesz go do zbudowania drzewa binarnego w celu wydajnego przeszukiwania tabeli w pamięci. Jest to klasyczny problem z algorytmem rankingowym i możesz znaleźć w Google szary turniej, aby uzyskać więcej informacji lub zajrzeć do mojej historii przepełnienia stosu. Zasadniczo turniej to drzewo binarne. Oto dobry artykuł na temat szarych kodów: http://villemin.gerard.free.fr/Wwwgvmm/Numerati/CodeGray.htm . Niestety to francuski. Oto jak wygenerować drzewo binarne z rankingu: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/229068 .

Gigamegs
źródło