Devo prima chiarire che la colonna dello stato non intende riflettere lo stato di un elemento del mondo 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 intera booleana / corta o su una colonna a carattere singolo, con mappature come true
/ 1
= Attivo o A
= Approvato
L'idea di base è di avere un supporto di recupero simile a cestino / cestino nell'applicazione (e simularlo nel database). Se esiste una GUI front-end o un'altra interfaccia che presumibilmente può consentire a un utente di "eliminare" i record, in realtà non elimina il record nella tabella, ma cambia semplicemente 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 "eliminato" (nella prospettiva dell'utente) deve essere recuperato, un DBA può facilmente ripristinare il record in Attivo o Approvato, il che sarebbe meglio che cercare backup e sperare di trovare il record originale Là. Oppure l'interfaccia stessa può consentire all'utente di visualizzare i record eliminati in una vista separata e ripristinarli in base alle esigenze, o addirittura eliminarli definitivamente (eliminando il record effettivo).
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ò fare in modo che il database imponga 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 al "cestino" o il rilevamento / recupero della tabella in modo nativo, in modo che possiamo consentire alle interfacce di eliminare i record effettivi senza preoccupazioni?
Nota: ho letto del mantenimento di una tabella di cronologia separata, ma ciò sembra peggiore in termini di archiviazione e di dover generare trigger e mantenere i trigger aggiornati con lo schema della tabella tracciata.