Database: per eliminare o non eliminare i record


117

Non credo di essere l'unica persona a chiederselo. Cosa pratichi di solito sul comportamento del database? Preferisci eliminare fisicamente un record dal database? O è meglio contrassegnare il record con un flag "cancellato" o una colonna booleana per indicare che il record è attivo o inattivo?


67
... se è più nobile nel database subire il gonfiore e la ridondanza dei flag, o portare DELETE in una tabella di record, e rimuovendoli, terminali. Cancellare, dormire;
nickf

7
Hey! Come faccio a votare un commento?
Nifle

Risposte:


48

Dipende sicuramente dal contenuto effettivo del tuo database. Se lo stai usando per memorizzare le informazioni sulla sessione, quindi cancellalo immediatamente quando la sessione scade (o viene chiusa), non vuoi che quella spazzatura sia in giro. Poiché non può essere riutilizzato per scopi pratici.

Fondamentalmente, cosa devi chiederti, potrei aver bisogno di ripristinare queste informazioni? Come le domande cancellate su SO, dovrebbero essere contrassegnate come "cancellate", poiché stiamo attivamente consentendo un annullamento dell'eliminazione. Abbiamo anche la possibilità di visualizzarlo anche per selezionare gli utenti, senza molto lavoro extra.

Se non stai attivamente cercando di ripristinare completamente i dati, ma desideri comunque tenerli in giro per scopi di monitoraggio (o simili). Suggerirei di trovare (per quanto possibile, ovviamente) uno schema di aggregazione e di spostarlo su un altro tavolo. Ciò manterrà la tua tabella primaria pulita dai dati 'cancellati', oltre a mantenere la tua tabella secondaria ottimizzata per scopi di monitoraggio (o qualunque cosa tu abbia in mente).

Per i dati temporali, vedere: http://talentedmonkeys.wordpress.com/2010/05/15/temporal-data-in-a-relational-database/


30

Vantaggi dell'utilizzo di un flag di eliminazione:

  1. Puoi recuperare i dati in un secondo momento se ne hai bisogno,
  2. L'operazione di eliminazione (aggiornamento del flag) è probabilmente più rapida dell'eliminazione effettiva

Contro dell'utilizzo di un flag di eliminazione:

  1. È molto facile perdere AND DeletedFlag = 'N'da qualche parte nel tuo SQL
  2. Più lento per il database nel trovare le righe che ti interessano tra tutte le schifezze
  3. Alla fine, probabilmente vorrai davvero eliminarlo comunque (supponendo che il tuo sistema abbia successo. E quando quel record ha 10 anni ed è stato "eliminato" 4 minuti dopo la creazione originale)
  4. Può rendere impossibile l'uso di una chiave naturale. Potresti avere una o più righe eliminate con la chiave naturale e una riga reale che desidera utilizzare la stessa chiave naturale.
  5. Potrebbero esserci motivi legali / di conformità per cui è necessario eliminare effettivamente i dati.

23

Come complemento a tutti i post ...

Tuttavia, se si prevede di contrassegnare il record, è opportuno considerare la possibilità di creare una visualizzazione per i record attivi. Ciò ti eviterebbe di scrivere o dimenticare il flag nella tua query SQL. Potresti prendere in considerazione una visualizzazione anche per i record non attivi, se ritieni che serva anche a uno scopo.


11

Sono contento di aver trovato questo thread. Anch'io mi chiedevo cosa ne pensasse la gente di questo problema. Ho implementato il "contrassegnato come cancellato" per circa 15 anni su molti sistemi. Ogni volta che un utente chiamava per dire che qualcosa è stato cancellato accidentalmente, era sicuramente molto più facile contrassegnarlo come non eliminato piuttosto che ricrearlo o ripristinarlo da un backup.

Stiamo usando postgresql e Ruby su rails, sembra che potremmo farlo in uno dei due modi, modificare rails o aggiungere un trigger ondelete e fare invece una funzione pl / pgsql per contrassegnare come cancellato. Sono propenso a quest'ultimo.

Per quanto riguarda i risultati delle prestazioni, sarà interessante vedere i risultati di EXPLAIN-ANALYZE su tabelle di grandi dimensioni con pochi elementi eliminati e molti elementi eliminati.

Nei sistemi utilizzati nel tempo che ho scoperto, i nuovi utenti tendono a fare cose sciocche come eliminare le cose accidentalmente. Quindi, quando le persone sono nuove in una posizione, hanno tutti i diritti di accesso della persona precedentemente in quella posizione tranne che con zero esperienza. L'eliminazione accidentale di qualcosa e la possibilità di recuperare rapidamente riporta tutti al lavoro rapidamente.

Ma come qualcuno ha detto, a volte potresti aver bisogno di quella particolare chiave per qualche motivo, a quel punto dovresti davvero cancellarla, quindi ricreare i record (annullando l'eliminazione e modificando il record).


1
+1 perché la facilità d'uso include la limitazione della mia capacità di commettere errori catastrofici.
Jesse

6

Ci sono anche problemi legali in entrambi i casi se sono coinvolti dati personali. Penso che dipenda molto da dove ti trovi (o da dove si trova il database) e quali sono i termini di utilizzo.

In alcuni casi le persone possono chiedere di essere rimosse dal sistema, nel qual caso è necessaria una cancellazione definitiva (o almeno la cancellazione di tutte le informazioni personali).

Verificherei con il tuo ufficio legale prima di adottare una strategia in entrambi i casi se sono coinvolte informazioni personali.


5

Li contrassegno come cancellati e non li elimino davvero. Tuttavia ogni tanto spazzo via tutta la spazzatura e la archivio, in modo che non danneggi le prestazioni.


2

Se sei preoccupato per i record "dormienti" che rallentano l'accesso al database, potresti voler spostare quelle righe in un'altra tabella che funge da tabella di "archivio".


1

Per i dati inseriti / gestiti dall'utente ho utilizzato il metodo flag che descrivi e ho fornito all'utente un'interfaccia "svuota il cestino" per eliminare effettivamente gli elementi se lo desidera.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.