Il modo migliore per progettare il database dei tornei


13

Sto creando una pagina web per piazzare scommesse su tutte le partite del prossimo torneo di calcio Euro 2012. Hai bisogno di aiuto per decidere quale approccio adottare per la fase a eliminazione diretta.

Di seguito ho creato un modello, di cui sono abbastanza soddisfatto quando si tratta di memorizzare i risultati di tutte le partite della fase a gironi "conosciute". Questo design rende molto semplice verificare se un utente ha effettuato una scommessa corretta o meno.

Ma qual è il modo migliore per conservare i quarti e le semifinali? Queste partite dipendono dal risultato nella fase a gironi.

Un approccio a cui ho pensato è stato quello di aggiungere TUTTE le partite alla matchestabella, ma assegnare variabili o identificatori diversi alle squadre di casa / fuori casa per le partite nella fase a eliminazione diretta. E poi avere qualche altra tabella con quegli identificatori mappati ai team ... Questo potrebbe funzionare, ma non sembra giusto.

Progettazione di base del database


Hai deciso di utilizzare MySQL o di aprire alternative?
Jack dice di provare topanswers.xyz il

Abbastanza risolto .. Ci sono dei vantaggi / svantaggi con MySQL di cui dovrei essere a conoscenza?
hampusohlsson,

Verifica che i vincoli non vengano applicati. Generalmente meno opzioni per applicare i vincoli con DRI, ma se ciò che conta per te dipende molto dalla tua applicazione. Felice di chattare se vuoi più opinioni :)
Jack dice di provare topanswers.xyz il

Grazie, ma non credo che avrei comunque usato i vincoli poiché non ne ho molta familiarità. Convaliderò tutti i dati nella mia domanda prima che
vengano

Bene bene. Ovviamente è più semplice nel DB ma questa è tutta un'altra conversazione ;)
Jack dice di provare topanswers.xyz il

Risposte:


3

Comincerei provando a correggere tutte le informazioni predeterminate nel modello stesso incluso

  • date / sedi
  • struttura (cioè fasi di gruppo / knockout)
  • regole (es. punteggio, regole di pareggio)

Alcune di queste informazioni saranno dati in tabelle, altre in logica codificata nelle viste.

Qualcosa del genere forse:

  • team (team_id, group_code enum ('A', 'B', 'C', 'D'), nome)
  • 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')
  • risultato (match_id, score_home, score_away)

Le informazioni su quali squadre giocano nel Q1 non devono mai essere archiviate direttamente perché possono essere calcolate dai risultati della fase a gironi. Le uniche modifiche da apportare man mano che il torneo avanza sono gli inserimenti nel resulttavolo.


3

Penso che usare l'ID squadra sia la strada giusta da percorrere. Un altro livello di astrazione per tutti i round di finali aggiunge solo complessità non necessaria per non molti benefici oltre al precaricamento della tabella delle partite con i dati.

La struttura dei dati sembra piuttosto solida per supportare questo. I quarti e le semifinali dovrebbero essere aggiunti alla tabella delle partite una volta raggiunti i risultati della partita iniziale. Se le partite vengono assegnate in modo casuale, si tratta di un'operazione manuale, tuttavia, se si trovano in un ordine particolare ...

   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

... allora questo potrebbe essere fatto con una query. Ancora una volta, la complessità della query potrebbe non valere la pena a seconda del numero di squadre


1

È una buona idea memorizzare tutte le partite nella tabella "partite". Tuttavia aggiungerei un campo adizionale "classifica" ad esso, perché in seguito è necessario per costruire un albero binario per interrogare in modo efficiente la tabella in memoria. È un classico problema di algoritmo di ranking e puoi cercare su Google il torneo in codice grigio per ulteriori informazioni o consultare la mia cronologia di stackoverflow. Fondamentalmente un torneo è un albero binario. Ecco un buon articolo sui codici grigi: http://villemin.gerard.free.fr/Wwwgvmm/Numerati/CodeGray.htm . Purtroppo è francese. Ecco come generare un albero binario dalla classifica: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/229068 .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.