Quali sono i modi per consentire il controllo delle versioni delle voci del database (dati)?
Pensa alle capacità dei sistemi di gestione dei contenuti per ripristinare le modifiche agli articoli.
Quali sono i loro pro / contro?
Quali sono i modi per consentire il controllo delle versioni delle voci del database (dati)?
Pensa alle capacità dei sistemi di gestione dei contenuti per ripristinare le modifiche agli articoli.
Quali sono i loro pro / contro?
Risposte:
Esistono fondamentalmente due approcci: una tabella di controllo, con tutti i valori precedenti memorizzati in essa, o includere una data di inizio / fine come parte della tabella e tutti gli aggiornamenti creano un nuovo record mentre si chiude quello vecchio.
Aggiornamento: SQL Server 2016 supporta questo come un / tipo di tabella modello di progettazione - https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server-2017
Un'idea è quella di utilizzare "Database di solo inserimento". L'idea di base è che non si eliminano o si aggiornano mai i dati di fila .
Ogni tabella che deve essere tracciata avrà due datetime
colonne from
e to
. Iniziano con il valore NULL
in ciascuno (dall'inizio del tempo alla fine del tempo). Quando devi "cambiare" la riga aggiungi una nuova riga e allo stesso tempo aggiorni la to
riga precedente Now
e from
la riga a cui stai aggiungendo Now
.
Per informazioni più dettagliate guarda:
Questa tecnica è chiamata AuditTrail
per gestire i dati legacy e i suoi negozi archiviano la cronologia delle modifiche.
Sembra che la domanda di questa natura sia già stata pubblicata:
Penso che puoi usare i trigger per ogni tabella e mantenere i dati in _history (o puoi dare qualsiasi nome) e su ogni inserimento, aggiornamento, cancellazione sulla tabella principale attiverà il tuo trigger e puoi salvare i dettagli in questa tabella. Meccanismo di trigger è disponibile anche con il database SQLite se ne usi uno.
Questo meccanismo è utile anche per grandi progetti. In questa tabella è possibile registrare le informazioni dell'utente che ha apportato le modifiche insieme al timestamp delle modifiche. è quindi possibile ripristinare la tabella in uno qualsiasi dei timestamp corrispondenti alle proprie esigenze.
Ogni database ha il suo modo di scrivere e trigger di codice. Se si utilizza SQLite, visitare SQLite.org per la sintassi. Per altri database è possibile visitare i loro siti ufficiali.
Probabilmente sei a conoscenza del motore db Sqlite . L'intero db viene salvato in un singolo file. L'API supporta anche i file system virtuali, quindi in pratica puoi organizzare l'archiviazione ovunque e con qualsiasi formato, basta rispondere alle operazioni di lettura e scrittura a determinati offset di file. Le possibili applicazioni per questo potrebbero essere la crittografia, la compressione e così via. La parte migliore di questo è che il livello contenitore non dovrebbe sapere nulla di database, formato di file sql o sqlite, basta obbedire ai callback xRead e xWrite.
Una delle idee era quella di implementare le funzionalità della macchina del tempo. Quindi qualsiasi operazione xWrite salva ogni segmento che sovrascriverà nella cronologia "annulla" e l'utente può scegliere una data nel passato per vedere cosa conteneva il db (probabilmente modalità di sola lettura). Non ho ancora un esempio funzionante (si è discusso al riguardo nella mailing list di sqlite), ma probabilmente altri motori forniscono API VFS, quindi è possibile fare qualcosa di simile. E una volta implementato, dovrebbe essere compatibile con strutture di database di qualsiasi complessità.
Il metodo utilizzato per le voci del database di controllo delle versioni è utilizzare una tabella di controllo. La tabella ha uno schema lungo le linee di:
Seq - Int ' Unique identifier for this table
Event - Char ' Insert / Update / Delete
TblName - Char ' Table that had field value changed
FldName - Char ' Field that was changed
KeyValue - Char ' delimited list of values for fields that make up the PK of table changed
UsrId - Char ' User who made the change
OldValue - Char ' Old value (converted to character)
NewValue - Char ' New value (converted to character)
AddTs - DateTime ' When the change was made
Abbiamo quindi i trigger su Inserisci / Aggiorna / Elimina delle tabelle che vogliamo monitorare.
Professionisti:
Contro:
Sto facendo una versione di questo ora. per ogni record ho una data inserita, una data modificata e un flag booleano Record attivo. Per l'inserimento iniziale, le date inserite e modificate sono entrambe impostate su Now () (questo esempio è in Access) e il flag Record attivo è impostato su true
. quindi se modifico quel record copio tutto in un nuovo record, cambiando i campi che l'utente sta cambiando, lascio la data di inserimento uguale all'originale e cambio la data modificata su Now (). Poi capovolgo il flag Active Record del record originale su false
e il nuovo record su true
. Ho anche un campo per ModifiedRecordsParentID in cui salvo l'identità del record originale.
Quindi, se ho anche bisogno di interrogare, posso solo restituire i record dove ActiveRecord = true
e otterrò solo le informazioni più aggiornate.
ActiveRecord
bandiera. La riga MAX (*) dovrebbe essere sempre il record corrente. Il ripristino di una versione precedente inserisce nuovamente detta riga nella tabella.
select top 1 order by id descending
farà.
inoltre, se si desidera memorizzare TUTTE le modifiche al DB nel tempo, è possibile verificare la registrazione ( /programming/3394132/where-can-i-find-the-mysql-transaction-log )