2009-02-02 22 views
91

Non penso di essere l'unica persona a chiedermi. Che cosa ti eserciti di solito sul comportamento del database? Preferisci eliminare fisicamente un record dal database? O è meglio semplicemente contrassegnare il record con un flag "eliminato" o una colonna booleana per indicare che il record è attivo o inattivo?Database: per cancellare o non cancellare record

+56

... se sia più nobile nel database a soffrire il rigonfiamento e la ridondanza dei flag, o prendere DELETE in una tabella di record, E rimuovendoli, terminarli. Per cancellare, per dormire; – nickf

+7

Ehi! Come faccio a votare un commento ?? – Nifle

+0

possibile duplicato di [Cancellazione fisica o logica del record del database] (http://stackoverflow.com/questions/378331/physical-or-logical-delete-of-database-record) – Sven

risposta

44

Dipende sicuramente dal contenuto effettivo del database. Se lo stai usando per memorizzare le informazioni di sessione, poi cancellalo immediatamente quando la sessione scade (o è chiusa), non vuoi che la spazzatura giacciono in giro. Poiché non può essere utilizzato nuovamente per scopi pratici.

Fondamentalmente, cosa è necessario chiedersi, potrebbe essere necessario ripristinare queste informazioni? Come le domande cancellate su SO, dovrebbero essere semplicemente contrassegnate come "eliminate", dato che stiamo consentendo un undelete attivo. Abbiamo anche la possibilità di visualizzarlo per selezionare anche gli utenti, senza molto lavoro extra.

Se non si sta attivamente cercando di ripristinare completamente i dati, ma si desidera continuare a utilizzarlo per scopi di monitoraggio (o simili). Suggerirei di capire (per quanto possibile naturalmente) uno schema di aggregazione e spingerlo su un'altra tabella. Ciò manterrà la tabella primaria pulita dei dati "eliminati" e manterrà la tabella secondaria ottimizzata per scopi di monitoraggio (o qualsiasi altra cosa tu abbia in mente).

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

2

Se si è preoccupati per i record "dormienti" che rallentano l'accesso al database, è possibile spostare tali righe in un'altra tabella fungendo da tabella "archivio".

4

Io li contrassegno come cancellato e in realtà non lo elimino. Comunque ogni tanto spazzo fuori tutta la spazzatura e la archiviano, quindi non uccide le prestazioni.

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 desiderano.

6

Ci sono anche questioni legali in entrambi i casi, se è coinvolto dei dati personali. Penso che dipenda molto da dove ti trovi (o dove si trova il database), e quali sono le condizioni d'uso.

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

Vorrei verificare con il vostro ufficio legale prima di adottare una strategia in entrambi i casi se sono coinvolte informazioni personali.

23

A favore di utilizzare un flag di eliminazione:

  1. È possibile ottenere i dati di tornare più tardi se ne avete bisogno,
  2. operazione Elimina (aggiornamento della bandiera) è probabilmente più veloce di eliminazione davvero

contro di utilizzare un flag di eliminazione:

  1. E 'molto facile perdere AND DeletedFlag = 'N' da qualche parte in il tuo SQL
  2. Più lento per il database per trovare le righe che ti interessano tra tutte le cazzate
  3. Eventualmente, probabilmente vorrai davvero cancellarlo (supponendo che il tuo sistema abbia successo.Che dire quando quel record ha 10 anni ed è stato "cancellato" 4 minuti dopo la creazione originale)
  4. Può rendere impossibile l'utilizzo di una chiave naturale. Potresti avere una o più righe cancellate con la chiave naturale e una riga reale che vuole usare la stessa chiave naturale.
  5. Potrebbero esserci motivi legali/di conformità per cui si intende eliminare effettivamente i dati.
18

Come complemento a tutti i messaggi ...

Tuttavia, se avete intenzione di segnare il record, la sua buona per considerare la possibilità di una visione, per i record attivi. Questo ti eviterà di scrivere o dimenticare il flag nella tua query SQL. Potresti considerare una vista anche per i record non attivi, se ritieni che serva anche a uno scopo.

9

Sono felice 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 veniva cancellato per errore, era sicuramente molto più facile contrassegnarlo come non cancellato piuttosto che ricrearlo o ripristinarlo da un backup.

Usiamo postgresql e Ruby su rotaie sembra che potremmo farlo in due modi, modificare i binari o aggiungere un trigger di ondelete e invece una funzione pl/pgsql da contrassegnare come eliminata. Mi sto appoggiando a quest'ultimo.

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

Nei sistemi utilizzati nel tempo che ho trovato, i nuovi utenti tendono a fare cose stupide 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 esperienza zero. Cancellando accidentalmente qualcosa e potendo rapidamente recuperare, tutti tornano al lavoro velocemente.

Ma come qualcuno ha detto, a volte potrebbe essere necessario quel particolare tasto indietro per qualche motivo, a quel punto avresti bisogno di cancellarlo davvero, quindi ricreare i record (cancellarlo e modificare il record).

+1

+1 perché la facilità d'uso include la limitazione delle mie capacità fare errori catastrofici. – Jesse