Sono abituato a vedere righe di tabelle con colonne come "DeletedDate" e non mi piacciono. L'idea stessa di "cancellato" è che la voce non avrebbe dovuto essere fatta in primo luogo. In pratica, non possono essere rimossi dal database ma non li voglio con i miei dati caldi. Le righe eliminate logicamente sono, per definizione, dati freddi a meno che qualcuno non voglia vedere specificamente i dati eliminati.
Inoltre, ogni query scritta deve escluderli in modo specifico e anche gli indici devono considerarli.
Quello che vorrei vedere è una modifica a livello di architettura del database e a livello di applicazione: creare uno schema chiamato 'eliminato'. Ogni tabella definita dall'utente ha un identico equivalente nello schema "eliminato" con un campo aggiuntivo contenente metadati: l'utente che lo ha eliminato e quando. È necessario creare chiavi esterne.
Successivamente, le eliminazioni diventano inserzioni-eliminazioni. Innanzitutto la riga da eliminare viene inserita nella sua controparte dello schema "eliminato". La riga in questione nella tabella principale può quindi essere eliminata. Tuttavia, è necessario aggiungere una logica aggiuntiva da qualche parte lungo la linea. Le violazioni delle chiavi esterne possono essere gestite.
Le chiavi esterne devono essere gestite correttamente. È buona norma avere una riga eliminata logicamente ma il cui principale / unico ha colonne in altre tabelle che si riferiscono ad essa. Questo non dovrebbe succedere comunque. Un lavoro regolare può rimuovere le righe della vedova (righe le cui chiavi primarie non hanno riferimenti in altre tabelle nonostante la presenza di una chiave esterna. Questa è, tuttavia, una logica aziendale.
Il vantaggio complessivo è la riduzione dei metadati nella tabella e il miglioramento delle prestazioni che comporta. La colonna 'deleteDate' dice che questa riga non dovrebbe essere effettivamente qui ma, per comodità, la lasciamo lì e lasciamo che la query SQL la gestisca. Se una copia della riga eliminata viene mantenuta in uno schema "eliminato", la tabella principale con i dati attivi presenta una percentuale più elevata di dati attivi (supponendo che sia archiviata in modo tempestivo) e meno colonne di metadati non necessarie. Gli indici e le query non devono più considerare questo campo. Minore è la dimensione delle righe, più righe possono essere adattate su una pagina, più velocemente SQL Server può funzionare.
Lo svantaggio principale è la dimensione dell'operazione. Ora ci sono due operazioni anziché una, oltre alla logica aggiuntiva e alla gestione degli errori. Può portare a un blocco maggiore rispetto all'aggiornamento di una singola colonna che altrimenti richiederebbe. La transazione mantiene i blocchi sulla tabella più a lungo e sono presenti due tabelle. L'eliminazione dei dati di produzione, almeno secondo la mia esperienza, è qualcosa che viene fatto raramente. Tuttavia, in una delle tabelle principali il 7,5% di quasi 100 milioni di voci ha una voce nella colonna "Data eliminata".
Come risposta alla domanda, l'applicazione dovrebbe essere a conoscenza di "undelete's". Dovrebbe semplicemente fare la stessa cosa in ordine inverso: inserire la riga dallo schema "eliminato" nella tabella principale e quindi eliminare la riga dallo "schema eliminato". Ancora una volta sono necessarie ulteriori logiche e gestione degli errori per evitare errori, problemi con chiavi esterne e simili.