Ogni volta che devo progettare un nuovo database, passo un po 'di tempo a pensare a come impostare lo schema del database per tenere un registro di controllo delle modifiche.
Alcune domande sono già state poste qui a riguardo, ma non sono d'accordo sul fatto che esista un unico approccio migliore per tutti gli scenari:
- Progettazione di database per revisioni
- Migliore progettazione per una tabella del database di controllo del registro delle modifiche
- Idee sulla progettazione di database per l'acquisizione di audit trail
Mi sono anche imbattuto in questo interessante articolo sul mantenimento di un registro delle modifiche al database che tenta di elencare i pro e i contro di ogni approccio. È scritto molto bene e ha informazioni interessanti, ma ha reso le mie decisioni ancora più difficili.
La mia domanda è: c'è un riferimento che posso usare, forse un libro o qualcosa come un albero decisionale a cui posso fare riferimento per decidere in che modo devo andare basato su alcune variabili di input, come:
- La maturità dello schema del database
- Come verranno interrogati i registri
- La probabilità che sarà necessario ricreare i record
- Cosa c'è di più importante: scrivere o leggere le prestazioni
- Natura dei valori che vengono registrati (stringa, numeri, BLOB)
- Spazio di archiviazione disponibile
Gli approcci che conosco sono:
1. Aggiungi colonne per data e utente creati e modificati
Esempio di tabella:
- id
- value_1
- value_2
- VALUE_3
- Data di Creazione
- data modificata
- creato da
- modificato da
Svantaggi principali: perdiamo la cronologia delle modifiche. Impossibile eseguire il rollback dopo il commit.
2. Inserisci solo tabelle
- id
- value_1
- value_2
- VALUE_3
- a partire dal
- per
- cancellato (booleano)
- utente
Principali svantaggi: come mantenere aggiornate le chiavi esterne? Enorme spazio necessario
3. Creare una tabella di cronologia separata per ogni tabella
Esempio di tabella cronologica:
- id
- value_1
- value_2
- VALUE_3
- VALUE_4
- utente
- cancellato (booleano)
- timestamp
Svantaggi principali: è necessario duplicare tutte le tabelle controllate. Se lo schema cambia, sarà necessario migrare anche tutti i registri.
4. Creare una tabella di cronologia consolidata per tutte le tabelle
Esempio di tabella cronologica:
- table_name
- campo
- utente
- NEW_VALUE
- cancellato (booleano)
- timestamp
Svantaggi principali: Sarò in grado di ricreare i record (rollback) se necessario facilmente? La colonna new_value deve essere una stringa enorme in modo che possa supportare tutti i diversi tipi di colonna.