Devo prima chiarire che la colonna dello stato è non intesa a riflettere lo stato di un elemento reale rappresentato dal record (riga) nella tabella. Piuttosto, è destinato a mostrare lo stato del record stesso.
Può essere semplice come Attivo / Inattivo o complicato come Approvato / Eliminato / Bloccato / In attesa / Rifiutato, ecc. Lo stato può essere memorizzato su una colonna booleana / breve intera o su una colonna di un singolo carattere, con mappature come true
/ 1
= attivo o A
= approvato.
L'idea di base è di avere un supporto per il recupero del cestino / spazzatura nell'applicazione (e simularlo nel database). Se è presente una GUI front-end o altra interfaccia che può presumibilmente consentire a un utente di "eliminare" i record, in realtà non elimina il record nella tabella, ma semplicemente cambia lo stato del record in Inattivo o Eliminato. Quando l'interfaccia recupera i record, ottiene sempre i record che corrispondono solo alla condizione che lo stato sia Attivo o Approvato.
Se l'utente commette un errore e il record "cancellato" (in prospettiva dell'utente) deve essere ripristinato, un DBA può facilmente ripristinare il record in Attivo o Approvato, il che sarebbe meglio che cercare i backup e, si spera, trovare il record originale lì. Oppure l'interfaccia stessa può consentire all'utente di visualizzare i record cancellati in una vista separata e ripristinarli se necessario, o addirittura eliminarli definitivamente (eliminando il record attuale).
Le mie domande:
- È una buona pratica o una cattiva pratica?
- Influisce sulla normalizzazione dei dati?
- Quali sono le potenziali insidie?
- Esiste un metodo alternativo per raggiungere lo stesso obiettivo? (vedi nota)
- Come si può avere il database imporre vincoli univoci sui dati solo per un determinato stato (ma consentire un numero qualsiasi di duplicati per altri stati)?
- Perché i database non forniscono una funzionalità simile a "cestino" o un monitoraggio / ripristino della tabella in modo nativo, quindi possiamo consentire alle interfacce di eliminare i record effettivi senza preoccuparci?
Nota: ho letto sul mantenimento di una tabella della cronologia separata, ma ciò sembra peggiore in termini di spazio di archiviazione e dover generare trigger e mantenere i trigger aggiornati con lo schema della tabella tracciata.