Mysql
 sql >> Database >  >> RDS >> Mysql

Gestione efficace delle modifiche ai dati

Sembra che tu stia cercando di implementare un Database temporale . Il supporto temporale è stata una delle principali aggiunte allo standard ANSI/ISO SQL:2011. MySQL (come la maggior parte degli RDBMS) è in ritardo rispetto allo standard. Pensa a Database temporale come all'equivalente DBMS di CVS/SVN/Git.

Al contrario, il database tradizionale che utilizziamo senza caratteristiche temporali può essere chiamato Database corrente .

In un database corrente , se provi a implementare il supporto temporale, puoi fallire in molti modi con approcci diversi:

  • L'approccio a un tavolo. Quando devi apportare modifiche, esegui UPDATEs sui tuoi record originali e, a meno che tu non abbia una sorta di logica di trigger/audit nostrana, la traccia della cronologia è assente. Anche se disponi di un registro di controllo/modifica, dovresti fare qualche brutta ricerca per ricostruire la cronologia delle modifiche.

  • L'approccio a due tavoli. Invece di apportare modifiche sul posto, dividi i tuoi dati in due tabelle, una con i record di base/originali (ad es. prenotazione) e un'altra tabella per le tue modifiche/modifiche/delta. Quindi almeno hai i tuoi dati originali conservati, ma ancora una volta devi scrivere una logica complessa per visualizzare i dati originali con modifiche stratificate. È anche peggio se ne vuoi solo alcuni delle modifiche apportate.

  • L'approccio precalcolato alla tabella risultante . Mantieni 3 o più tabelle:i record di base, le modifiche e anche una tabella che tenta di avere sempre la risultante (mantiene aggiornata la base + modifiche). Buona fortuna a scrivere i trigger e le procedure per eseguire questo calcolo ogni volta che esegui INSERTs , e il Cielo ti aiuta se un UPDATE o DELETE è necessario. La configurazione è fragile e potrebbe non essere sincronizzata, come deadlock e rollback. Se non lo fai all'interno del DB con trigger/procedure, potresti provare a implementare il calcolo risultante nel codice dell'applicazione, ma avere buona fortuna e potrebbe diventare brutto con i consumatori multi-thread. E tuttavia, non hai facile accesso ai risultati con solo alcuni modifiche applicate.

Conclusione: Se non sei limitato a MySQL, dovresti davvero prendere in considerazione l'utilizzo di un DB con supporto temporale integrato. In caso contrario, implementerai nuovamente la ruota.