Memorizzazione di stop / punti iniziali in un database

5

Diciamo che sto memorizzando i punti di inizio e di arresto per utente in una tabella di database.

Ad esempio ... diciamo in un sistema di chat, un utente deve solo vedere le linee 24-293 e 500-512. (Diciamo che si è disconnesso per la notte e non era presente tra le righe 294-499).

Il salvataggio di ogni punto di partenza e di arresto come una riga discreta porterebbe a un enorme tavolo in mongolfiera, che non è esattamente l'ideale. Non starei cercando su questi punti, quindi l'indicizzazione non è necessaria.

Come potrei salvare questo tipo di informazioni nel database?

Stavo pensando di salvarlo in JSON:

accountID   |   lines
        1   |   [24,293,500,512]

Dove ogni valore dispari denota un inizio, e ogni valore pari denota una fine. La mia unica preoccupazione è che gli utenti altamente attivi si uniranno e lasceranno una chat e riempiranno rapidamente la riga se lines era di tipo VARCHAR.

Quindi forse TEXT , o anche LONGTEXT .

Sto andando giù per un percorso di dolore, o è un metodo valido?

Grazie in anticipo!

    
posta Julian H. Lam 06.10.2011 - 19:44
fonte

2 risposte

13

Stai cercando di denormalizzare fatti separati in un singolo record, piuttosto che archiviarli come record individuali.

Non farlo.

Sembra che tu ritenga che sia più facile ed efficiente fare l'analisi degli pseudo-set stessi piuttosto che memorizzarli nel modo normale. Questo è possibile ma improbabile a meno che tu non lo provi effettivamente e determini che il tuo database ha problemi con la quantità di record che creerai. Ma fintanto che i fatti vengono creati dall'attività di clic manuale degli utenti, è molto improbabile che il database esaurisca le righe prima che si esauriscano i cicli del processore che manipolano le stringhe sempre crescenti di cui si avrebbe bisogno. Gioca ai punti di forza dei componenti che usi. I database servono per archiviare milioni su milioni di righe. Prova a superare quelli a tuo rischio!

    
risposta data 06.10.2011 - 20:03
fonte
9

Prima di tutto, il database è buono e memorizza molte righe. Questo è qualcosa che è ideale per un database.

Se conosci non avrai mai bisogno di fare di più con i dati, e puoi garantire che la dimensione della stringa abbia un massimo, quindi non farà male, causerà solo alcuni cicli di analisi della CPU extra . (Ma non essere sorpreso dal fatto che le cose non sono sempre prevedibili.)

Se trovi che hai bisogno di quanto segue, ti sei appena creato un po 'di dolore:

  • sovraccaricare il json per includere più informazioni perché è più semplice che mantenere uno schema di database
  • trovando che vuoi cercare o ordinare i numeri o unirti ad altre tabelle
  • buon debug sul processo che inserisce, aggiorna ed elimina i dati
  • alcuni utenti colpiscono il caso limite di richiedere così tanti dati di stringa che il campo viene troncato

Nel momento in cui decidi di passare ai dati della tabella, dovrai creare un processo per analizzare la stringa e inserire nuove righe nella nuova tabella. Per la tua attuale specifica JSON, non dovrebbe essere troppo brutto scrivere. (Fintanto che non hai sovraccaricato il json.)

Memorizzare i numeri in un database come una stringa aggiunge un ulteriore livello di elaborazione che non è necessario. Ora devi analizzare la stringa. Dovrai comunque memorizzare i numeri se si tratta di righe di tabella o di una stringa, quindi le dimensioni non dovrebbero avere importanza. Non mi preoccuperei del numero di righe nel database, gli indici andranno bene.

Attaccare con un formato (database) invece di due (database + json) non è mai una cattiva idea.

Creerei una tabella secondaria solo per i punti di inizio e fine con un indice sull'ID account. Quindi puoi fare affidamento sulle funzionalità del database per fornire ricerca, ordinamento e memorizzazione nella cache.

accountID | start | stop
------------------------
        1 |    24 |  293
        1 |   500 |  512
    
risposta data 06.10.2011 - 20:02
fonte

Leggi altre domande sui tag