Opzioni per l'implementazione del database e della logica di programmazione per l'applicazione statistica?

0

Sto implementando un'applicazione web basata sulle statistiche. Le statistiche si riferiscono agli eventi sportivi.

In questo momento ho un database postgresql con una tabella che contiene una riga per ogni corrispondenza. Questo è un esempio forzato dei dati nel DB:

league | season | match_date | team_home | team_away | team_home_q1_score | team_home_q2_score | team_home_q3_score | team_home_q4_score | team_away_q1_score | team_away_q2_score | team_away_q3_score | team_away_q4_score
NFL    | 2015/16| 2016-01-24 | Panthers  | Cardinals | 17                 | 7                  | 10                 | 15                 | 0                  | 7                  | 0                  | 8
NFL    | 2015/16| 2016-01-24 | Broncos   | Patriots  | 7                  | 10                 | 0                  | 3                  | 6                  | 3                  | 3                  | 6

Ogni riga ha la lega, la stagione, la data della partita, la squadra di casa e il team in visita, quindi ci sono 54 colonne smallint che contengono varie altre statistiche. Ci sono attualmente 28000 righe nel DB. È probabile che i dati vengano aggiornati una volta al giorno.

In definitiva gli utenti visiteranno una pagina web, selezioneranno una partita futura e saranno presentati con varie statistiche aggregate in base alle ultime 10 partite delle squadre. Probabilmente ci saranno centinaia di metriche calcolate in base ai dati sottostanti, ad esempio "% di partite in cui la squadra ha segnato più di x punti".

Ho anche un server di applicazioni Java seduto davanti al database, che sta già gestendo alcune altre attività correlate.

Ho bisogno di capire il modo migliore per servire queste statistiche agli utenti del sito web. Per "migliore" intendo le prestazioni dal punto di vista degli utenti (velocità di essere in grado di visualizzare le statistiche) e utilizzare al meglio le risorse del server.

Per come la vedo io, queste sono le mie opzioni e ho incluso le mie considerazioni sui pro e contro di ciascun metodo:

Aggregato all'interno del DB

Ogni volta che l'utente seleziona una corrispondenza nella pagina Web, viene eseguita una serie di stored procedure per calcolare tutte le metriche aggregate all'interno del DB. Questi vengono quindi restituiti alla pagina web.

Pro:

  • I calcoli possono essere fatti tutti facilmente all'interno del DB senza l'uso di cursori, ecc. Le prestazioni saranno probabilmente migliori in questo modo rispetto ai metodi di looping in Java

Contro:

  • Gran numero di query eseguite sul DB per ogni corrispondenza. Potrebbe potenzialmente essere mitigato usando memcached
  • Grande quantità di dati restituiti dal server DB

Aggregato all'interno del server dell'app

Seleziona le ultime x corrispondenze dalla tabella dei risultati della partita, restituisci questi dati al server delle applicazioni, calcola le metriche aggregate e restituiscile alla pagina web

Pro:

  • Meno dati restituiti dal server DB
  • Potrebbe ancora usare memcached per ridurre ulteriormente il carico sul server DB

Contro:

  • Java sarà probabilmente molto meno efficiente di SQL nel calcolare tutte le metriche derivate

ETL

Esegui un'attività ETL una volta al giorno quando vengono inserite nuove statistiche nel DB, che aggrega le statistiche in tabelle aggiuntive, che possono quindi essere semplicemente selezionate da

Pro:

  • Probabilmente la migliore prestazione, con calcoli eseguiti solo una volta al giorno anziché al volo
  • Anche in questo caso, è possibile utilizzare la memorizzazione nella cache delle query per ridurre il carico del server DB

Contro:

  • Maggiore spazio di archiviazione necessario per conservare i dati aggregati
  • Non molto flessibile. Non è possibile selezionare semplicemente i dati per "ultimi 20 giochi" anziché "ultimi 10 giochi" senza una tabella DB aggiuntiva.

Ho perso delle opzioni migliori o non sono riuscito a individuare particolari inconvenienti con le mie opzioni esistenti?

    
posta ctrlz 31.01.2016 - 20:09
fonte

0 risposte

Leggi altre domande sui tag