Estoy acostumbrado a ver filas de tablas con columnas como 'DeletedDate' en ellas y no me gustan. La noción misma de 'eliminado' es que la entrada no debería haberse hecho en primer lugar. Prácticamente, no se pueden eliminar de la base de datos, pero no los quiero con mis datos activos. Las filas eliminadas lógicamente son, por definición, datos fríos a menos que alguien específicamente quiera ver los datos eliminados.
Además, cada consulta que se escriba tiene que excluirlos específicamente y los índices también deben considerarlos.
Lo que me gustaría ver es un cambio en el nivel de arquitectura de la base de datos y el nivel de la aplicación: cree un esquema llamado 'eliminado'. Cada tabla definida por el usuario tiene un equivalente idéntico en el esquema 'eliminado' con un campo adicional que contiene metadatos: el usuario que lo eliminó y cuándo. Las claves foráneas requieren ser creadas.
A continuación, elimina se convierte en insertar-eliminar. Primero, la fila que se eliminará se inserta en su contraparte del esquema 'eliminado'. La fila en cuestión en la tabla principal se puede eliminar. Sin embargo, es necesario agregar lógica adicional en algún lugar a lo largo de la línea. Las infracciones de claves externas pueden ser manejadas.
Las claves foráneas deben manejarse adecuadamente. Es una mala práctica tener una fila eliminada lógicamente pero cuyo primario / único tiene columnas en otras tablas que se refieren a él. Esto no debería suceder de todos modos. Un trabajo normal puede eliminar filas de viudas (filas cuyas claves principales no tienen referencias en otras tablas a pesar de la presencia de una clave externa. Sin embargo, esto es lógica empresarial.
El beneficio general es la reducción de metadatos en la tabla y la mejora del rendimiento que aporta. La columna 'deletedDate' dice que esta fila en realidad no debería estar aquí, pero, por conveniencia, la dejamos allí y dejamos que la consulta SQL la maneje. Si una copia de la fila eliminada se mantiene en un esquema 'eliminado', entonces la tabla principal con los datos activos tiene un mayor porcentaje de datos activos (suponiendo que se archiven de manera oportuna) y menos columnas de metadatos innecesarios. Los índices y consultas ya no necesitan considerar este campo. Cuanto más corto sea el tamaño de la fila, más filas se pueden ajustar en una página, más rápido puede funcionar SQL Server.
La principal desventaja es el tamaño de la operación. Ahora hay dos operaciones en lugar de una, así como la lógica adicional y el manejo de errores. Puede llevar a más bloqueo que actualizar una sola columna, de lo contrario tomaría. La transacción mantiene bloqueos en la tabla por más tiempo y hay dos tablas involucradas. Eliminar datos de producción, al menos en mi experiencia, es algo que rara vez se hace. Aún así, en una de las tablas principales, el 7,5% de casi 100 millones de entradas tiene una entrada en la columna 'Fecha eliminada'.
Como respuesta a la pregunta, la aplicación debería ser consciente de 'recuperar'. Simplemente tendría que hacer lo mismo en orden inverso: inserte la fila del esquema 'eliminado' en la tabla principal y luego elimine la fila del esquema 'eliminado'. Nuevamente, se necesita algo más de lógica y manejo de errores para garantizar que se eviten errores, problemas con claves externas y similares.