Domanda

Ho un progetto che coinvolge un sistema di voto web. I valori di corrente ei relativi dati vengono memorizzati in diverse tabelle. I dati storici saranno un aspetto importante di questo progetto così ho anche creato tabelle di controllo alla quale i dati attuali verranno spostati in su base regolare.

Trovo questa strategia altamente inefficiente. Anche se solo i dati di archivio su base giornaliera, il numero di righe diventerò grande anche se solo 1 o 2 utenti fanno gli aggiornamenti su un dato giorno.

La prossima alternativa mi viene in mente è memorizzare solo le voci che sono stati modificati. Ciò significa dover costruire la logica di creare automaticamente una vista di un dato giorno. Ciò significa meno righe memorizzati, ma notevole complessità.

La mia idea finale è un po 'meno convenzionale. Dal momento che i dati storici saranno per fini di comunicazione, non c'è alcuna necessità di utenti di Internet per l'accesso rapido. Sto pensando che il mio db potrebbe non avere i dati storici in esso. DB rappresenta solo stato attuale. Poi, tutti i giorni, l'intero db potrebbe essere caricato in oggetti (numero di utenti / dati è relativamente bassa) e poi serializzato a qualcosa come XML o JSON. Questi file potrebbero essere diffed con il giorno precedente e immagazzinati. In realtà, SVN potrebbe fare questo per me. Quando voglio i dati per un dato giorno passato, il sistema deve recuperare la versione per quel giorno e deserializzare in oggetti. Si tratta ovviamente di un'operazione costosa, ma le prestazioni non è tanto una preoccupazione qui. Sto pensando di utilizzare LINQ per questo che penso semplificherebbe le cose. La procedura di serializzazione dovrebbe essere abbastanza organizzata per il diff di lavorare bene.

Quale approccio vorresti fare?

Grazie

È stato utile?

Soluzione

Tutto quello che ci hai detto sul vostro sistema è che si tratta di voti. Finché si memorizzano timestamp per cui voti sono stati espressi si dovrebbe essere in grado di generare una relazione contenente la votazione conteggio dello stato in qualsiasi momento ... no?

Ad esempio, dire che ho un sistema che collima funzioni preferite (occhi, sorriso, testa a testa, ...). Se voglio sapere quanti voti ci sono stati per una caratteristica particolare di una data particolare, quindi vorrei semplicemente coincidere tutti i voti per la funzione con un timestamp minore o uguale a quella data.

Se si vuole avere una storia di altre cose, allora si dovrebbe seguire un approccio simile.

Credo che questo sia il modo in cui è fatto.

alt text

Altri suggerimenti

Se stai praticamente chiedendo come revisioni dei dati sono memorizzati in database relazionali, quindi vorrei esaminare come i wiki fanno.

I wiki sono tutto su come mantenere storia dettagliata delle revisioni. Essi utilizzano database relazionali semplici per lo stoccaggio.

Si consideri il database di Wikipedia schema .

Hai pensato di usare un vero e proprio sistema di controllo versione, piuttosto che cercare di calzascarpe un database al suo posto? Io stesso sono abbastanza parziale git, ma ci sono molte opzioni. Tutti hanno un buon supporto per le differenze tra le versioni, e tendono ad essere ben ottimizzato per questo tipo di carico di lavoro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top