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 datetimecolonne frome to. Iniziano con il valore NULLin ciascuno (dall'inizio del tempo alla fine del tempo). Quando devi "cambiare" la riga aggiungi una nuova riga e allo stesso tempo aggiorni la toriga precedente Nowe fromla riga a cui stai aggiungendo Now.
Per informazioni più dettagliate guarda:
Questa tecnica è chiamata AuditTrailper 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 falsee 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 = truee otterrò solo le informazioni più aggiornate.
ActiveRecordbandiera. 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 descendingfarà.
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 )