2013-04-02 8 views
5

Attualmente sto lavorando a un progetto che calcola i dati e li memorizza per ID in un database di analisi.Memorizzazione di statistiche su periodi di tempo e fusi orari più lunghi

Ad esempio la quantità di volte in cui un articolo di notizie viene letto (e quindi ci sono come 20 categorie di dati memorizzati come numero intero).

Noi memorizzare i dati in campi come segue: int id_utente int value_type_id int valore datetime datetime

Usiamo 4 tavoli, x_hour, x_day, x_week, x_month In questo modo non avremo a calcolare i dati su un potenziale di poche migliaia o addirittura milioni di record.

I dati devono essere calcolati al volo e filtrati da determinati join. Questo non è un problema e funziona come previsto e ad una velocità che è soddisfacente.

Il problema che segue. Vogliamo che i dati vengano visualizzati nel fuso orario dell'utente che li visualizza, il fuso orario non è sempre lo stesso poiché può essere utile, ad esempio UTC-5 o UTC + 4.

Poiché archiviamo le date in UTC, abbiamo problemi con intervalli su giorni, settimane e mesi poiché se l'attività è archiviata un'ora prima di mezzanotte, gli intervalli più grandi la vedranno come ieri, anche se potrebbe essere lo stesso giorno in quel fuso orario.

Ho letto soluzioni aggiungendo 24 colonne per contenere i dati per ogni fuso orario, qualcuno ha una soluzione diversa.

+0

Non sono sicuro di aver capito il tuo punto. Stai dicendo che vuoi segnalare eventi in base all'ora in cui si verificano localmente? – Mehran

+0

No, li memorizzo per ora del giorno settimana e mese, quindi abbiamo bisogno di 40 colonne per i fusi orari, poiché tutti i dati per la settimana 20 possono essere diversi nel fuso orario +12 come in +0. Ma è stato fatto. anni fa;) –

risposta

1

Sembra che l'unica strada da percorrere sia l'utilizzo di bucket di 15 minuti, o di fusi orari definiti in modo preciso, che otterrebbero solo circa 40 colonne.

Quindi abbiamo fatto lo stesso per giorni settimane e mesi in modo che abbiamo dati corretti per ogni fuso orario.

Un po 'più di tempo e più spazio per l'archiviazione dei dati, ma se manteniamo puliti i nostri dati potrebbe essere una soluzione abbastanza decente.

+1

Da allora non hai trovato altre soluzioni? – Aurel

+0

Non c'è altra soluzione decente, la cosa migliore sarebbe avere il tuo mysql e roba in esecuzione su SSD per rendere tutto veloce;). Ma nessun altro codice sollutions. –

+0

Thx, puoi mostrare un esempio di design per questo tavolo di cui hai parlato (15min bucket + timezones)? – Aurel

3

Continua a memorizzare i dati in UTC.

Passare il fuso orario dell'utente alla query.

Converti in SELECT, utilizzando la funzione CONVERT_TZ:

CONVERT_TZ(`datetimefield`, 'UTC', 'Europe/Amsterdam') 

Dove 'Europe/Amsterdam' viene sostituito con il fuso orario appropriato.

È meglio utilizzare le stringhe del fuso orario IANA come sopra, anziché scostamenti come "UTC-5", a condizione che questi dati siano disponibili. Gestirà correttamente i problemi relativi all'ora legale nelle regioni in cui ciò avviene.

Ulteriori note: https://dev.mysql.com/doc/refman/5.5/en/mysql-tzinfo-to-sql.html - Questo programma è utilizzato per intializzare MySQL con i dati del fuso orario.

+1

Non esattamente quello che ho bisogno di leggere qui sotto (fuori caratteri) Quello che ho bisogno di sapere è se c'è un modo corretto per la memorizzazione dei dati su intervalli più ampi. Ad esempio una memoria giornaliera conterrà una data come: 2013-03-29 00:00:00, questo sarà UTC. Ma avrà dati errati per qualcuno in un fuso orario diverso da UTC. Esempio, sono in GMT + 1 se invii qualcosa alle 00:30 ora locale, il sistema genererà dati che dicono allo spettatore che ho postato il giorno precedente. Dal momento che è memorizzato di giorno. Il problema è che se continuo a usare ore il sistema diventerà troppo lento per i dati per periodi di un mese o più. –

+0

Vedo, suggerirei di aggiungere colonne 'day' e' from' che rappresentano l'inizio e la fine di ogni intervallo orario, e quindi memorizzare 24 righe basate su UTC per ogni giorno e tali dati. La selezione sarà quindi in grado di recuperare il set convertito corretto di 24 righe per il dato giorno utente-ora. – bcmcfc

+0

@bcmcfc - Questa soluzione funziona solo se tutti i fusi orari target hanno offset di ore complete. Diversi hanno offset di 30 minuti e ci sono anche un paio di offset di 45 minuti. Quindi, se vuoi tutto il mondo, hai bisogno di bucket di incremento di 15 minuti. –