Database
 sql >> Database >  >> RDS >> Database

Cosa hanno in comune i Giochi Olimpici, le partite di calcio di UEFA Euro 2016 e i database?

Sentendo quello che faccio, le persone tendono a farmi la stessa domanda:Puoi sviluppare un sistema che preveda i risultati delle partite di calcio? O i risultati delle medaglie olimpiche? Personalmente, non ripongo molta fiducia nelle previsioni. Tuttavia, se avessimo una grande quantità di dati storici e indicatori rilevanti, potremmo sicuramente progettare un sistema che ci aiuti a elaborare ipotesi più accurate. In questo articolo considereremo un modello in grado di memorizzare i risultati di partite e tornei.

Questo modello si concentra principalmente su partite, statistiche e risultati del calcio europeo, ma potrebbe essere facilmente modificato per adattarsi a molti altri sport. La mia motivazione principale per questo articolo sono stati i due grandi eventi calcistici di quest'anno:il Campionato UEFA Euro 2016 che si è appena svolto e le Olimpiadi estive 2016 che si stanno svolgendo proprio ora.

Cosa sappiamo prima dell'inizio del torneo?

Prima dell'inizio del torneo, sappiamo quasi tutto, tranne la cosa più importante:chi vincerà. Dichiariamo brevemente esattamente ciò che già sappiamo:

  • Le date di inizio e di fine del torneo
  • I luoghi in cui si svolgeranno le partite
  • Gli orari esatti di inizio delle partite
  • Quali squadre si sono qualificate per il torneo
  • I giocatori di ciascuna di queste squadre
  • Le prestazioni passate di ogni giocatore e la sua forma attuale

Quali dettagli della partita vogliamo memorizzare?

I tornei consistono in più partite. Prima di memorizzare i dettagli della partita, dobbiamo:

  • Collega ogni partita con il torneo
  • Registra la fase del torneo quando la partita è stata giocata (ad es. fase a gironi, semifinali)

Abbiamo anche bisogno di memorizzare i dettagli per le singole partite, tra cui:

  • Le squadre coinvolte nella partita
  • Formazioni di partenza e sostituzioni
  • Eventi della partita (nel calcio sono:gol, rigore, fallo, cartellino giallo, ecc.)
  • Punteggio finale
  • Azioni dei giocatori durante la partita

Utilizzeremo questi dati per acquisire tutti gli eventi importanti delle partite. Confrontare le prestazioni di un giocatore prima e durante la partita potrebbe portare a determinate conclusioni. Forse non saremmo in grado di prevedere i risultati finali delle loro prestazioni (cioè una vittoria o una sconfitta), ma le statistiche potrebbero sicuramente aiutarci a fare ipotesi con un certo grado di affidabilità.

Presentazione del modello




Il modello è suddiviso in quattro aree principali:

  • Tournament details
  • Match details
  • Events
  • Indicators and Performance

Le tabelle al di fuori di queste aree sono dizionari (sport , phase , position ), cataloghi (sport_event , team , player ) e una singola relazione molti-a-molti (plays ).

Descriveremo prima le tabelle senza categoria, quindi daremo un'occhiata da vicino a ciascuna area.

Le tabelle senza categoria

Queste tabelle sono importanti perché le tabelle di tutte e quattro le aree le utilizzano come dizionari o cataloghi.

Lo sport la tabella elenca tutti gli sport che memorizzeremo nel nostro database. Probabilmente avremo un solo sport qui, il calcio maschile, ma questa tabella ci dà la flessibilità di aggiungere sport simili (ad esempio il calcio femminile) se necessario.

Nel sport_event tabella, memorizzeremo gli eventi legati ai nostri sport. Un esempio potrebbero essere i “Giochi Olimpici del 2016”.

La phase table è un dizionario che contiene tutte le possibili fasi del torneo. Contiene valori come "fase a gironi" , "ottavi di finale" , "quarti di finale" , "semifinali" , "finale" .

Il team table è, come puoi immaginare, un semplice elenco di tutte le squadre. I valori possibili sono "Croazia" , "Polonia" , "Stati Uniti" ecc. Se utilizziamo il database per archiviare informazioni su competizioni per club o campionati, avremmo anche valori come "Barcellona" , "Real Madrid" , "Bayern" , "Manchester United" ecc.

Nel player tavolo, memorizzeremo i record di tutti i giocatori appartenenti alle squadre interessate.

Il plays Il tavolo è la nostra unica relazione molti-a-molti e mette in relazione giocatori e squadre. Un giocatore può appartenere a più squadre contemporaneamente (es. nazionale e club), ma durante un torneo giocherà ovviamente per una sola squadra.

Infine, abbiamo la position tavolo. Questo semplice dizionario memorizzerà un elenco di tutte le posizioni richieste. Nel calcio, questi includono portiere, difensore centrale, attaccante, ecc.

Dettagli del torneo

Nota: Se vuoi solo memorizzare i risultati delle singole partite, non è necessario utilizzare questa sezione.

Un torneo consiste in più di una partita; sia UEFA Euro 2016 che gli eventi calcistici delle Olimpiadi estive 2016 sono tornei. Come abbiamo detto prima, possiamo memorizzare una singola partita nel nostro database, ma possiamo anche mettere in relazione le partite ai relativi tornei. I tavoli nella sezione Torneo sono:

  • tournament – Questo contiene tutti i dati di base del torneo:lo sport, la data di inizio, la data di fine, ecc. Abbiamo anche bisogno di memorizzare il nome del torneo e una descrizione di dove si svolgerà. Il sport_event_id è facoltativo perché un torneo non deve essere associato a un evento più grande (come le Olimpiadi).
  • group – Questo elenca tutti i gruppi in quel torneo. UEFA Euro 2016 ha avuto sei gironi, dalla A alla F.
  • participant – Queste sono le squadre che giocano nel torneo; ogni partecipante può essere assegnato a un gruppo. La maggior parte dei tornei inizia con una fase a gironi e poi prosegue con una fase a eliminazione diretta (ad es. UEFA Euro, Coppa del Mondo UEFA, calcio olimpico). Alcuni tornei avranno solo una fase a gironi (es. campionati nazionali), mentre altri avranno solo una fase a eliminazione diretta (es. coppe nazionali).
  • in_team – Questa tabella fornisce una relazione molti-a-molti che memorizza le informazioni sui giocatori registrati per quel torneo e le loro posizioni previste.
  • tournament_schedule – Secondo me, questa è la tabella più interessante di questa sezione. L'elenco di tutte le partite giocate durante questo torneo è memorizzato qui. Il tournament_id l'attributo indica a quale torneo appartiene ogni partita e il phase_id attributo definisce la fase durante la quale si svolgerà la partita. Conserveremo anche la posizione della partita e l'ora in cui inizia. Entrambi i partecipanti saranno descritti da campi di testo. Al termine della fase a gironi, conosceremo tutti i matchup per il round eliminatorio. Ad esempio, all'inizio di UEFA Euro 2016, sapevamo che la vincitrice del Gruppo E (1E) giocherà contro la seconda classificata del Gruppo D (2P). Dopo che tutti e tre i turni della fase a gironi sono stati giocati, questa coppia è stata Italia-Spagna.

Dettagli partita

I Match details l'area viene utilizzata per memorizzare i dati per le singole corrispondenze. Useremo due tabelle:

  • match – Questo contiene tutti i dettagli su una singola partita; questa partita può essere correlata a un torneo, ma potrebbe anche essere una partita singola. Quindi il tournament_schedule_id l'attributo è facoltativo e memorizzeremo il sport_id , start_time e location attributi di nuovo qui. Se la partita fa parte di un torneo, allora tournament_schedule_id verrà assegnato un valore. Il team_1_id e team_2_id gli attributi sono riferimenti alle squadre coinvolte nella partita. Il goals_team_1 e goals_team_2 gli attributi contengono il risultato della partita. Sono obbligatori e dovrebbero avere "0" come valore predefinito per entrambi.
  • in_match – Questa tabella è un elenco di tutti i giocatori registrati per quella partita; i giocatori che non partecipano avranno un NULL nel started_at attributo, mentre i giocatori che sono entrati come sostituzioni avranno started_at> 0 . Se un giocatore è stato sostituito, avrà un ended_at attributo che corrisponde a started_at attributo del giocatore che li ha sostituiti. Se il giocatore è rimasto in campo per l'intera partita, il suo ended_at l'attributo avrà lo stesso valore di end_time attributo.

Eventi partita

Questa sezione ha lo scopo di memorizzare tutti i dettagli o gli eventi accaduti durante il gioco. E le tabelle sono:

  • event – Questo è un dizionario che elenca tutti gli eventi che vogliamo memorizzare. Nel calcio, questi sono valori come "fallo commesso" , "fallo subito" , "cartellino giallo" , "cartellino rosso" , "calcio di punizione" , "penalità" , "obiettivo" , "fuorigioco" , "sostituzione" , "giocatore espulso dalla partita" .
  • match_event – Questo mette in relazione gli eventi con la partita. Conserveremo il event_time così come le informazioni sui giocatori relative a quell'evento (in_match_id ).
  • related_event – Questo è ciò che unisce le informazioni sull'evento. Per spiegare, diamo un'occhiata a un esempio quando il giocatore A commette fallo sul giocatore B. Inseriamo un record nel match_event tabella che indica che il giocatore A ha commesso un fallo e un'altra che indica che il giocatore B ha commesso un fallo. Aggiungeremo anche un record al related_event tabella, dove il "fallo commesso" sarà il genitore e il "fallo subito" sarà il bambino. Registreremo anche i risultati del fallo:cartellino giallo, calcio di punizione o calcio di rigore e magari un gol.

Indicatori e prestazioni

Questa sezione dovrebbe aiutarci ad analizzare giocatori e squadre prima e dopo la partita.

L'indicator table è un dizionario con una serie predefinita di indicatori per ogni giocatore prima di ogni partita. Questi indicatori dovrebbero descrivere la forma attuale del giocatore. Questo elenco potrebbe contenere valori come:"numero di gol nelle ultime 10 partite" , "distanza media percorsa nelle ultime 10 partite" , "numero di salvataggi per GK nelle ultime 10 partite" .

Il performance dizionario è molto simile a indicator , ma lo utilizzeremo per memorizzare solo i valori correlati alla singola corrispondenza:"distanza coperta" , "pass accurati" , ecc.

Il player_indicator e performance_indicator le tabelle condividono una struttura quasi identica:

  • in_match_id – si riferisce al giocatore che partecipa a una determinata partita
  • indicator_id / performance_id – fa riferimento all'indicator o "dizionari delle prestazioni".
  • value – memorizza il valore di quell'indicatore (ad es. un giocatore ha percorso 10,72 km di distanza)
  • description – contiene una descrizione aggiuntiva, se necessario
  • Cosa è successo durante la partita?

    Con tutti questi dati inseriti, potremmo facilmente ottenere dettagli sulle partite, eventi e statistiche per ogni partita nel nostro database.

    Questa semplice query restituirebbe i dettagli di base per una partita imminente:

    SELECT team_1.`team_name`, team_2.`team_name`, `match`.`start_time`, `match`.`location`
    FROM `match`, `team` AS team_1, `team` AS team_2
    WHERE `match`.`team_1_id` = team_1.`id`
    AND `match`.`team_2_id` = team_2.`id`
    

    Per ottenere un elenco di tutti gli eventi in-play durante una determinata partita, utilizzeremo la query seguente:

    SELECT `event`.`event_name`, `match_event`.`event_time`, `player`.`first_name`, `player`.`last_name`
    FROM `match`, `match_event`, `event`, `in_match`, `player`
    WHERE `match_event`.`match_id` = `match`.`id`
    AND `event`.`id` = `match_event`.`event_id`
    AND `in_match`.`id` = `match_event`.`in_match_id`
    AND `player`.`id` = `in_match`.`player_id`
    AND `match`.`id` = @match
    ORDER BY `match_event`.`event_time` ASC
    

    Ci sono numerose query aggiuntive che mi vengono in mente; è facile fare un'analisi quando si hanno i dati. Se hai misurato e memorizzato un gran numero di indicatori e dati sulle prestazioni dei giocatori, potresti essere in grado di mettere in relazione questi parametri con un risultato finale. Personalmente non credo in tali previsioni; c'è il fattore fortuna durante le partite, oltre a numerosi altri fattori che non puoi conoscere fino all'inizio del gioco. Tuttavia, se hai un set di dati di grandi dimensioni e molti parametri, le tue possibilità di fare previsioni più accurate aumentano.

    Il modello presentato in questo articolo ci consente di memorizzare le partite, i dettagli delle partite e una cronologia delle prestazioni di ogni giocatore. Possiamo anche impostare indicatori di forma per ogni giocatore prima della partita. La memorizzazione di dettagli sufficienti dovrebbe fornirci più parametri su cui basare le nostre ipotesi. Non sto dicendo che potremmo pronosticare il risultato della partita, ma potremmo divertirci un po'.

    Potremmo anche modificare facilmente questo modello per memorizzare i dati per altri sport. Questi cambiamenti non dovrebbero essere troppo complessi. Aggiunta di un sport_id l'attributo ai dizionari dovrebbe fare il trucco. Tuttavia, penso che sarebbe saggio avere una nuova istanza per ogni diverso sport.