Najlepszy zawodnik reprezentacji NCAA Basketball Bracket

Jaki jest najlepszy schemat bazy danych do reprezentowania NCAA Mens Basketball bracket? Oto link, jeśli nie jesteś zaznajomiony: http://www.cbssports.com/collegebasketball/mayhem/brackets/viewable_men

Widzę kilka różnych sposobów modelowania tych danych, z jedną tabelą, wieloma tabelami, twardo zakodowanymi kolumnami, nieco dynamicznymi sposobami itp. Potrzebujesz sposobu, aby modelować zarówno to, w jakim nasionie i miejscu znajduje się każda drużyna, wraz z każdym meczem i wynikiem (i ewentualnie wynikiem) każdej z nich. Potrzebujesz również sposobu na reprezentowanie, kto kogo gra na jakim etapie turnieju.

W duchu marcowego szaleństwa, pomyślałem, że to będzie dobre pytanie. Istnieje kilka oczywistych odpowiedzi tutaj, a głównym celem tego pytania jest, aby zobaczyć wszystkie różne sposoby można odpowiedzieć na to pytanie. Która droga jest najlepsza może być subiektywna do języka, którego używasz lub jak dokładnie z nim pracujesz, ale staraj się zachować odpowiedzi db agnostic, język agnostic i dość wysoki poziom. Jeśli ktoś ma wszelkie sugestie dotyczące lepszego sposobu sformułowania tego pytania lub lepszego sposobu jego zdefiniowania daj mi znać w komentarzach.

Author: casperOne, 2009-03-16

8 answers

Dla RDBMS, myślę, że najprostszym podejściem, które jest nadal wystarczająco elastyczne, aby dostosować się do większości sytuacji, jest wykonanie następujących czynności:

  • Teams has [team-id (PK)], [nazwa], [region-id (FK to Regions)], [initial-seed] . Będziecie mieli po jednym wpisie dla każdej drużyny. (Tabela regionów jest trywialną tabelą kodów z tylko czterema wpisami, po jednym dla każdego regionu NCAA i nie jest wymieniona proszę.)

  • Uczestnicy ma [game-id (FK do gry)], [team-id (FK to Teams)], [wynik (nullable)], [wynik] . [wynik] jest nullable, aby odzwierciedlić, że drużyna może przegrać. Będziesz miał zazwyczaj dwóch uczestników na grę.

  • Gry has [game-id (PK)], [Data], [Lokalizacja] . Aby dowiedzieć się, które zespoły grały w meczu, sprawdź odpowiednie ID gry w tabeli uczestników. (Pamiętaj, że może być więcej niż dwa zespoły, jeśli ktoś odpadł lub został zdyskwalifikowany.)

Aby ustawić początkowy wspornik, dopasuj odpowiednie nasiona do siebie. W miarę rozgrywania meczów należy pamiętać, która drużyna ma wynik = Zwycięzca w danym meczu; drużyna ta jest dopasowywana do zwycięzcy innego meczu. Uzupełniaj drabinkę, dopóki nie zostanie już więcej zwycięskich drużyn.

 5
Author: John Feminella,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-16 13:53:35

Naturalną skłonnością jest patrzenie na wspornik w kolejności, w jakiej rozgrywane są mecze. Czytasz tradycyjny schemat z zewnątrz. Ale pomyślmy o tym na odwrót. Każdy mecz rozgrywany jest pomiędzy dwoma drużynami. Jeden wygrywa, drugi przegrywa.

Jest w tym coś więcej niż tylko to. Zwycięzcy danej pary gier zmierzą się ze sobą w innej grze. Istnieje więc również związek między samymi grami, niezależnie od tego, kto gra w te gry. Oznacza to, że drużyny, które zmierzą się w każdym meczu (z wyjątkiem pierwszej rundy) są zwycięzcami dwóch wcześniejszych meczów.

Można więc zauważyć, że każda gra ma dwie" gry dla dzieci", które poprzedzają ją i decydują, kto zmierzy się w tej grze. Brzmi to dokładnie jak drzewo binarne: każdy węzeł korzeniowy ma co najwyżej dwa węzły potomne. Jeśli wiesz, kto wygrywa każdy mecz, możesz łatwo określić drużyny w grach "rodzicielskich".

Więc, aby zaprojektować bazę danych, aby to modelować, naprawdę tylko potrzeba dwóch bytów: Team i Game. Każdy Game ma dwa klucze obce, które odnoszą się do innych Games. nazwy nie mają znaczenia, ale modelujemy je jako oddzielne klucze, aby wymusić wymóg, że każda gra ma nie więcej niż dwie poprzednie gry. Nazwijmy je leftGame i rightGame, Aby zachować nomenklaturę drzewa binarnego. Podobnie, powinniśmy mieć klucz o nazwie parentGame, który śledzi odwrotną relację.

Ponadto, jak już wcześniej wspomniałem, można łatwo określić drużyny, które zmierzą się w każdym gry, patrząc na to, kto wygrał dwie poprzednie gry. Więc naprawdę trzeba tylko śledzić zwycięzcę każdej gry. Tak więc nadaj podmiotowi Game klucz obcy winner do Tabeli Team.

Teraz jest drobna sprawa zasiewu wspornika. Czyli modelowanie meczów pierwszej rundy. Można to modelować poprzez posiadanie Game dla każdej drużyny w ogólnym konkursie, gdzie ta drużyna jest winner i nie ma poprzednich gier.

Tak więc ogólny schemat be:

Game:
    winner: Team
    leftGame: Game
    rightGame: Game
    parentGame: Game
    other attributes as you see fit

Team:
    name
    other attributes as you see fit

Oczywiście, można dodać wszystkie inne informacje, które chcesz do podmiotów: lokalizacja, wyniki, wynik (w przypadku, gdy gra została wygrana przez przepadek lub inne nietypowe warunki).

 10
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-24 20:11:43

Ponieważ nie określiłeś RDBMS, będę trochę inny i pójdę z podejściem CouchDB, ponieważ czytałem o tym w ten weekend. Oto struktura dokumentów, które wymyśliłem.

{
  "round" : 1, //The final would be round 5, and I guess Alabama St. vs. Morehead would be 0
  "location" : "Dayton, OH",
  "division": "South",
  "teams" : ["UNC", "Radford"]  //A feature of Couch is that fields like teams don't need a fixed nuber of columns.
  "winner" : "UNC"  //Showing my bias
}

Bardziej interesująca lub kompletna aplikacja może zawierać dane dotyczące drużyn, rankingów itp. Wydaje się, że podejście Johna dobrze pokrywa ten kąt. Witam wszelkie uwagi osób, które lepiej wiedzą o moich umiejętnościach na kanapie.

 2
Author: Jeremy DeGroot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-16 12:59:32

Stworzyłem mały system z następującymi tabelami:

Gry: GameId, TournId, RoundId, Sequence, Date, VisitorId, VisitorScore, HomeId, HomeScore, WinnerId, WinnerGameId, WinnerHome (bit)

Predid, UserId, GameId, PredVisitorId, PredHomeId, PredWinnerId

Rundy: Rounded, TournId, RoundNum, Heading1, Heading2

Teams: TeamId, TournId, TeamName, Seed, MoreInfo, Url

Turnieje: TournId, TournDesc

Użytkownicy: TournId, Nazwa użytkownika

WinnerGameId łączy zwycięzcę meczu z następnym. WinnerHome mówi, czy zwycięzca jest domem lub gościem następnej gry. Poza tym, myślę, że to całkiem oczywiste.

 2
Author: FrobozzJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-24 20:29:01

Proponowany Model

Proponowany schemat ER http://img257.imageshack.us/img257/1464/ncaaer.jpg

Tabela Drużyn

Wszystko, co musimy wiedzieć o drużynie, to nazwa i zalążek. Dlatego potrzebujemy tabeli" Team " Do Przechowywania wartości zalążkowej. Jedynym kluczem kandydata jest nazwa zespołu, więc użyjemy go jako podstawowego, aby wszystko było proste. Nazwy drużyn NCAA są mało prawdopodobne, aby zmienić w trakcie jednego turnieju lub zawierają duplikaty, więc powinno to być odpowiednie klucz.

Tabela Wyników

Tabela "MatchUp" może być używana do parowania drużyn w każdym z meczów. Klucze obce (FK1, FK2) do "zespołu" zapewnią, że zespoły istnieją, a klucz podstawowy nad tymi wartościami zapewnia, że zespoły są dopasowane do siebie tylko raz.

Klucz obcy (FK4) do tabeli "Team" z tabeli "MatchUp" zapisze zwycięzcę. Logicznie rzecz biorąc, zwycięzcą musi być jedna z dwóch drużyn biorących udział w meczu. Ograniczenie kontroli przed głównym kluczem może to zapewnić.

Po ustaleniu wyniku meczu, ziarno zwycięzcy może zostać pobrane z tabeli drużyn w celu porównania z innymi zwycięzcami w celu określenia kolejnych wygranych. Po zrobieniu tego FK (FK3) do wynikającego meczu można zapisać do decydującego meczu ups w celu zobrazowania postępów w turnieju (chociaż te dane mogą być prawdopodobnie wyprowadzone w dowolnym momencie).

Stół Do Gier

Ja również wzorował się na grach z każdego meczu. Gra jest identyfikowana przez match up, którego jest częścią i numer sekwencji oparty na kolejności, w jakiej miała miejsce podczas meczu. Mecze mają zwycięzcę z tabeli drużynowej (FK2). Punktacja może być również zapisana w tej tabeli.

 1
Author: Blake Taylor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-25 13:48:56

4 tabele:

Team (Team, Region, Seed)

User (UserId, Email, blablabla)

Bracket (BracketId, UserId, Points)

Wybierz (BracketId, GameId, Team, Points)

Każdy nawias przesłany przez osobę będzie miał 63 wiersze w tabeli wyboru.
Po rozegraniu każdej gry aktualizujesz tabelę wyboru, aby zdobyć poszczególne typy. Pole punktów w tej tabeli będzie zerowe za grę jeszcze nie rozegraną, 0 za nieprawidłowy wybór lub liczba dodatnia dla poprawnego wyboru. GameId jest tylko kluczem identyfikującym, gdzie w danym przedziale użytkowników znajduje się ten wybór (np.: East_Round2_Game2, FinalFour_Game1).

Kolumna punktów w tabeli bracket może być aktualizowana po każdej aktualizacji tabeli pick, tak aby zawierała sumę punktów dla tego bracket. Najchętniej oglądane będą rankingi, nie chcemy ich sumować za każdym razem, gdy ktoś chce zobaczyć ranking.

Nie musisz trzymać stołu ze wszystkimi grami że rzeczywiście się grał lub ich wyniki, po prostu zaktualizować stół wyboru po każdej grze. Możesz nawet podświetlić wspornik poprawnych / nieprawidłowych typów, patrząc na kolumnę punktów w tabeli wyboru.

 1
Author: Keith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-25 21:34:51

W śledzeniu dużej liczby różnych prognoz: możesz użyć 67 bitów do śledzenia wyników każdej gry. (tj. Każdy z sześćdziesięciu siedmiu meczów rozegranych w turnieju jest reprezentowany przez bit, 1 = "Drużyna A wygrywa", 0 = "drużyna B wygrywa"). Aby wyświetlić dowolny wspornik, możesz użyć dość prostej funkcji mapowania 67 bitów do interfejsu użytkownika. Funkcja zna nazwy zespołów i ich początkową lokalizację, a następnie śledzi ich ruch przez wspornik, ponieważ śledzi "bitboard".

 1
Author: Daniel Patrick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-22 16:11:27

Używam tego samego schematu dla wszystkich moich baz danych.

t
--------
1 guid PK
2 guid FK
3 bit

To w moim kodzie:

select [2],[3] from t where [1] = @1

@1 jest identyfikatorem danych, które pobieram. Następnie, jeśli [2] nie jest null, wybieram ponownie, ustawiając @1 na [2].

To naprawdę ułatwia modelowanie sytuacji, którą opublikowałeś.
 -4
Author: Shawn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-26 02:31:48