2014-12-30 12 views
5

vorrei qualche consiglio su come organizzare al meglio i miei modelli Django/tabelle del database per contenere i dati della mia webappDjango database di pianificazione - dati di serie temporali

Im progettazione di un sito che conterrà un insieme di dati agli utenti di telemetria da un gioco di simulazione di corse. Quindi ci sarà un'app desktop companion che campionerà i dati del gioco ogni 0,1 secondi per una varietà di informazioni (auto, traccia, velocità, gas, freno, frizione, giri, ecc.). Ad esempio, in una gara di 2 minuti, ciascuna di queste variabili contiene 1200 punti dati (10 campioni al secondo * 120 secondi).

L'importante è che questa lista di dati possa contenere fino a 20 variabili e potrebbe potenzialmente crescere in futuro. Quindi 1200 * il numero di variabili che hai è la quantità di dati per una singola sessione di gara. Se un singolo utente invia 100 sessioni e ci sono 100 utenti ... la quantità di dati si somma molto rapidamente.

L'app spedirà quindi tutti questi dati per una sessione di gara sul database per il sito web. I dati DEVONO essere trasferiti tra gioco e sito web tramite un file CSV. Quindi strutturalmente sono limitato a ciò che CSV può fare. Il sito Web ti consentirà quindi di scegliere una sessione di gara/giro e di tracciare queste informazioni su grafici di serie temporali separati (per ciascuna variabile), e ti permetterà di tracciare la tua sessione contro qualcun altro per vedere dove si trovano le differenze

La mia domanda ecco come si struttura questo database per contenere così tante informazioni?

La struttura più semplice che ho in mente è quella di avere un tavolo separato per ogni pista, quindi ogni riga/entrata sarà una sessione di gara su quella traccia. I campi in questa tabella saranno le variabili sopra.

Il problema che ho è:

1) la maggior parte delle variabili nella lista sopra sono dati di serie temporali e non valori singoli (ad esempio, velocità var potrebbe essere simile: 70, 72, 74, 77, 72, 71, 65 dove i valori sono campioni distanziati di 0,1 secondi l'uno dall'altro durante l'intero giro). Come memorizzi questo tipo di informazioni in una tabella/campo?

2) La lunghezza di ogni var nella lista sopra sarà sempre la stessa lunghezza per ogni singola sessione di gara (se il tuo giro è durato 1min 35 allora tutti i tuoi vars cattureranno i dati solo per quel lasso di tempo), ma dato che voglio essere in grado di confrontare diversi giri l'uno con l'altro, i tempi di sessione saranno diversi per ogni giro. In altre parole, per quanto posso conservare i dati di serie temporali per quelle variabili, deve essere di dimensioni variabili

Ogni pensiero sarebbe apprezzato

+0

Qual è la tua definizione di un tavolo enorme? Quanti dischi? Un database come PostgreSQL è realizzato per miliardi di record per tabella. Le prestazioni provengono da query intelligenti e indici utili. Le dimensioni di una tabella non contano molto, non ti preoccupare se non hai la prova che la dimensione della tabella è il tuo problema. –

+0

beh, immagino che la dimensione non sia tanto un problema qui quanto la struttura del database per i dati delle serie temporali. Ad esempio, creo una tabella separata per ogni sessione di gara, ogni riga è una voce temporale che sale dall'inizio della corsa alla fine? In questo modo si finirebbe con centinaia di migliaia di tabelle (una per ogni razza caricata). – Simon

+0

Oppure hai un numero finito di tavoli (uno per ogni traccia), ogni fila è una sessione di gara su quella traccia. Quindi i campi sono le variabili (velocità, gas, freno, ecc.) E trovare un modo per memorizzare i dati delle serie temporali all'interno di ciascuno di questi campi? – Simon

risposta

2

Una cosa che può aiutare con tavoli enormi è partizionamento. A giudicare dal tag postgresql che hai impostato per la tua domanda, dai un'occhiata qui: http://www.postgresql.org/docs/9.1/static/ddl-partitioning.html

Ma per cominciare vorrei andare con una tabella semplice, supportata da un ragionevole insieme di indici. Da quello che capisco, ogni inserimento di dati nella tabella sarà identificato dall'ID della sessione di gara, dall'id del giocatore e dall'indicatore del tempo. Queste colonne dovrebbero essere coperte con indici in base ai tuoi requisiti di query.

Come per le due domande: 1) Le informazioni vengono memorizzate come numeri interi semplici. Ricordarsi di impostare un tipo di dati appropriato per tali colonne. Ad es. se sei sicuro al 100% che alcuni valori saranno molto piccoli, puoi utilizzare il tipo di dati smallint. Altro su tipi di dati interi qui: http://www.postgresql.org/docs/9.3/static/datatype-numeric.html#DATATYPE-INT

2) Che non sarà un problema se ogni lista var sarà diversa riga nella tabella. Sarai in grado di inserire quanti ne desideri.

Quindi, per riassumere le cose. Vorrei iniziare con uno schema a tabella singola MOLTO semplice. Dal punto di vista django questo sarebbe simile a questa:

class RaceTelemetryData(models.Model): 
    user = models.ForeignKey(..., index_db=True) 
    race = models.ForeignKey(YourRaceModel, index_db=True) 
    time = models.IntegerField() 
    gas = models.IntegerField() 
    speed = models.SmallIntegerField() 
    # and so on... 

Additionaly, è necessario creare un indice (manualmente) per (user_id, race_id, tempo) colonne, in modo da cercare, dati relativi a una sessione di gara (e smistamento) sarebbe veloce.

In futuro, se le prestazioni di questa singola tabella sono troppo lente, sarà possibile sperimentare indici aggiuntivi o partizioni. PostgreSQL è abbastanza flessibile nel modificare le strutture di database esistenti, quindi non dovresti avere molti problemi con esso.

Se si decide di aggiungere una nuova variabile alla raccolta, sarà semplicemente necessario aggiungere una nuova colonna alla tabella.

EDIT:

Alla fine si finisce con un tavolo, che ha almeno queste colonne: id_utente - Per specificare che i dati degli utenti questa riga è di circa. race_id - Per specificare i dati di gara di questa riga. tempo - Per identificare l'ordine corretto in cui rappresentare i dati.

In questo modo, quando si desidera ottenere informazioni sulla quinta gara di Joe, si cercano le righe che hanno user_id = 'Joe_ID' and race_id = 5, quindi ordinare tutte quelle righe in base alla colonna dell'ora.

+0

quindi forse non capisco, o non ho descritto il problema correttamente prima, ma nel tuo modello di Django hai (per esempio) gas e velocità come campi che contengono valori singoli. Tuttavia, nel mio caso, per ogni gara di gas e velocità ciascuna deve essere una serie temporale propria. Perché ho bisogno di registrare la velocità dei giocatori ogni 0,1 secondi per l'intera durata della gara - questo significa che il campo di velocità deve contenere più di 1000 valori ordinati (cioè la rappresentazione dei giocatori aumenta di velocità ogni 0,1 secondi di quella sessione di gara). Come si inserisce qualcosa di simile in un intfield? – Simon

+0

Non si comprimono quei 1000 valori in un campo. Crei 1000+ oggetti RaceTelemetryData che risultano in più di 1000 righe nella tabella del database. Uno per ogni 0,1 secondi della gara. Quindi puoi scorrere su quegli oggetti per creare un array se ne hai bisogno, o interrogare la tabella usando un SQL esplicito. – Maciek

+0

ah, capisco, finisci con quelle 1000+ file in un tavolo, quindi il tavolo stesso rappresenta 1 sessione di gara. Questo significa sull'intero sito, si finisce con centinaia di migliaia di tavoli (uno per ogni razza che viene presentata). Questo è un metodo più preferito rispetto al montaggio di un'intera serie storica (probabilmente una stringa json) in un singolo campo e con un numero di tavoli molto inferiore?Non ho molta esperienza db quindi questo è onestamente tutto nuovo per me – Simon

Problemi correlati