Design - Stringhe JSON che memorizzano grandi quantità di dati per una grande quantità di utenti

0

Ho un sito Web che consente agli utenti di essere "tracciati" e tracciare il loro tempo / lavoro. Ciò comporta che gli utenti siano in grado di aggiornare il proprio account con il mio sito al massimo ogni minuto, ma in genere gli utenti lo fanno solo poche volte al giorno. Tuttavia, non c'è nulla che impedisca ad altre persone di aggiornare il tuo account.

Ogni aggiornamento crea un datapoint, un'istantanea se lo desideri, lo stato del loro account e la quantità di lavoro che hanno svolto.

Gli utenti possono visualizzare la quantità di lavoro che hanno svolto il giorno passato o la settimana scorsa. Questo viene fatto cambiando l'intervallo dei punti dati che vuoi vedere.

La mia domanda ora è: c'è la possibilità molto probabile di avere utenti 300k +. Ci sono anche alcuni account utente che le persone seguono più da vicino di altri, ad esempio un amministratore delegato o un manager, e quindi questi account verranno aggiornati più spesso. Ciò comporta che ci sono possibili 100k + punti dati per un utente singolo , nel giro di un anno o giù di lì.

Attualmente stavo pensando di archiviarli solo tramite la seguente mappatura:

unixtime -> account snapshot

Sembra che sia più facile archiviare come un grande array JSON per un utente, ad esempio (con altri dettagli che vorrei memorizzare):

jsonArray = {
    "alice": {
        "totalHours": 31.6,
        "updates": {
            1515653260 : { work: 95%, hours: 8 },
            1515691399 : { work: 93%, hours: 10 },
            1515695125 : { work: 91%, hours: 7.6 },
            1515698694 : { work: 56%, hours: 6 },
         }
    }
     "bob": {
        "totalHours": 7.32,
        "updates": {
            1515654356 : { work: 95%, hours: 1 },
            1515690342 : { work: 93%, hours: 6.32 },
         }
    }
}

Questa è una soluzione efficace? Non riesco a immaginare una stringa json occupando così tanto spazio che MySQL non sarebbe in grado di mantenerla ma non mi sono mai occupato di cose che probabilmente cresceranno così grandi.

Ci sono altre strutture dati che potrei usare, o che sarebbero più efficienti nell'acquisizione / archiviazione dei dati?

    
posta sej 11.01.2018 - 20:37
fonte

2 risposte

2

I tuoi requisiti di ambito (300K + utenti, 100K + byte per utente) suggeriscono l'uso di un database relazionale come MySQL o un archivio dati del documento come MongoDB, non un Array JSON. JSON è principalmente un meccanismo di trasferimento dei dati, non un meccanismo di archiviazione, e non ha gli strumenti necessari (indici, query) necessari per lavorare efficacemente con così tanti dati.

    
risposta data 11.01.2018 - 22:18
fonte
1

Dal mio punto di vista, potrebbe esserci un numero di cose che farei diversamente. In primo luogo, quando si dispone di un sistema con un numero potenzialmente elevato di utenti simultanei, è molto importante assicurarsi di non aggiornare le risorse condivise, poiché ciò rende tutte le operazioni degli utenti su un singolo blocco.

In secondo luogo, perdi la maggior parte dei vantaggi di avere un database del tutto se archivi tutti i tuoi dati come un blob JSON. Non è indicizzato, non può essere interrogato senza caricare in memoria, ecc ... Dovresti pensare a modellare i tuoi dati per raggiungere i tuoi requisiti funzionali e non funzionali, piuttosto che scaricarli tutti in un unico oggetto.

Infine, se hai intenzione di utilizzare JSON come formato di interscambio tra il tuo codice e il tuo database, potresti prendere in considerazione una soluzione di database di documenti di qualche tipo, che parlerebbe in linguaggio JSON o BSON nativo.

    
risposta data 11.01.2018 - 22:18
fonte

Leggi altre domande sui tag