Primero tengo que aclarar que la columna de estado no pretende reflejar el estado de un elemento del mundo real representado por el registro (fila) en la tabla. Más bien, está destinado a mostrar el estado del registro en sí.
Puede ser tan simple como Activo / Inactivo o complicado como Aprobado / Suprimido / Bloqueado / Pendiente / Rechazado, etc. El estado se puede almacenar en una columna entera booleana / corta o en una columna de un solo carácter, con asignaciones como true/ 1= Activo o A= Aprobado.
La idea básica es tener un soporte de recuperación de papelera de reciclaje / basura en la aplicación (y simularlo en la base de datos). Si hay una interfaz gráfica de usuario u otra interfaz que supuestamente puede permitir que un usuario "elimine" registros, en realidad no elimina el registro en la tabla, sino que simplemente cambia el estado del registro a Inactivo o Eliminado. Cuando la interfaz obtiene registros, siempre obtiene los registros que solo coinciden con la condición de que el estado sea Activo o Aprobado.
Si el usuario comete un error y el registro "eliminado" (en la perspectiva del usuario) necesita ser recuperado, un DBA puede volver a conectar fácilmente el registro para que esté activo o aprobado, lo que sería mejor que buscar copias de seguridad y, con suerte, encontrar el registro original allí. O la interfaz en sí misma puede permitir al usuario ver los registros eliminados en una vista separada y restaurarlos según sea necesario, o incluso eliminarlos permanentemente (eliminar el registro real).
Mis preguntas:
- ¿Es esta una buena práctica o una mala práctica?
- ¿Afecta la normalización de los datos?
- ¿Cuáles son las posibles trampas?
- ¿Hay algún método alternativo para lograr el mismo objetivo? (ver nota)
- ¿Cómo puede hacer que la base de datos imponga restricciones únicas en los datos solo para un determinado estado (pero permita cualquier número de duplicados para otros estados)?
- ¿Por qué las bases de datos no proporcionan una característica similar a la "papelera de reciclaje" o el seguimiento / recuperación de tablas de forma nativa, por lo que podemos permitir que las interfaces eliminen los registros reales sin preocupaciones?
Nota: Leí acerca de mantener una tabla de historial separada, pero eso parece peor en términos de almacenamiento y tener que generar desencadenantes y mantener los desencadenantes actualizados con el esquema de la tabla rastreada.