sql - ¿Son las eliminaciones suaves una buena idea?
database database-design (15)
Algunas veces, las eliminaciones suaves son necesarias. Por ejemplo, supongamos que tiene una tabla de Factura que hace referencia a una tabla de Productos. Una vez que haya creado una Factura con un Producto específico, entonces nunca podrá eliminar ese Producto (y si su RI está configurada correctamente, no le permitirá).
Este escenario específico asume que nunca querrá eliminar las Facturas, que en una empresa real probablemente no desee eliminar los datos financieros históricos.
Aunque hay muchos otros casos en los que no podría eliminar algunos datos como un efecto secundario de una dependencia, la cadena no puede eliminarse por razones comerciales u otras.
Esta pregunta ya tiene una respuesta aquí:
¿Los borrados suaves son una buena idea o una mala idea?
En lugar de eliminar un registro en su base de datos, simplemente lo IsDeleted = true
como IsDeleted = true
, y luego de la recuperación del registro puede IsDeleted = true
como False
.
¿Es esta una buena idea?
¿Es una mejor idea eliminar físicamente el registro, luego moverlo a una base de datos de archivo, y si el usuario quiere recuperar la grabación, el software buscará el registro en el archivo y lo volverá a crear?
Depende de las circunstancias. Pude ver situaciones en las que se te exige legalmente que realmente elimines algo. Tal vez alguien haya solicitado que su número de seguro social sea removido permanentemente de su sistema. O tal vez tiene un registro duplicado que desea consolidar en un solo registro. Mantener el duplicado dando vueltas con una bandera borrada puede no ser ventajoso.
También hay una desventaja técnica: no puede hacer eliminaciones en cascada, lo que borra automáticamente cualquier referencia a los datos eliminados para evitar violaciones de claves externas. Esto no es necesariamente un gran problema, pero es algo a tener en cuenta.
De lo contrario, creo que es una buena idea.
Depende de los datos. Algunos datos no se pueden eliminar debido a requisitos legales / de auditoría.
Los sitios de redes sociales, por otro lado, deberían proporcionar una opción para eliminar una cuenta con todos los datos asociados, incluida la información de contacto, fotos, mensajes, etc. Es una verdadera molestia si no lo hacen, por ejemplo, Facebook.
Digo que es una mala idea, generalmente (con algunas excepciones, tal vez).
Primero, su base de datos debe ser respaldada regularmente, por lo que nunca debería encontrarse en una situación en la que perdería datos de forma permanente debido a un BORRADO (a menos que sea una eliminación de los datos recién agregados, por supuesto).
En segundo lugar, una eliminación suave como esta significa que ahora debe incluir una WHERE IsDeleted = false
en cada consulta en esta tabla (y mucho peor si está UNIENDO estas tablas). Un error aquí se detectaría tan pronto como un usuario o el examinador notaran que un registro borrado aparecía nuevamente, lo que podría tomar algún tiempo. Además, sería fácil para un desarrollador omitir la cláusula WHERE de COUNT (*) consultas, lo que podría llevar más tiempo descubrir (trabajé en un proyecto donde esto había estado ocurriendo durante años, no muchos registros fueron "borrados") , por lo que los totales estaban cerca de lo esperado y nadie se dio cuenta).
Finalmente, una eliminación suave funcionará en una tabla con claves artificiales, pero posiblemente no funcionará en una tabla con una clave primaria natural (por ejemplo, si "borra" a alguien de una tabla marcada con el número de la Seguridad Social, ¿qué hace cuando ¿Necesita agregarlo de nuevo? No diga "incluir IsDeleted en una clave primaria compuesta").
En una revisión de diseño, esperaría que el desarrollador demuestre conocimiento de los costos y beneficios y presente una excelente razón para realizar borrados suaves de esta manera. "¿Por qué no hacerlo?" no es una excelente razón
Encontré soft-deletes para los siguientes escenarios generales:
CASO 1: eliminar el registro de ser usuario / código visible, pero tener el registro en el nivel de base de datos, ya que la empresa está interesada en saber que tenía esos registros.
Estos requisitos son principalmente impulsados por el negocio y, por lo general, en el núcleo es quizás un requisito legal (como @joshperry y @armandino escenarios) tener el registro anterior en la base de datos y crear un nuevo registro para cada cambio realizado. En este punto, vería CASE 2 y evaluaría si cumple los requisitos antes de tener una bandera de IsDeleted
CASO 2: pistas de auditoría para realizar un seguimiento de la evolución de un registro: hay toneladas de artículos decentes en línea para mantener registros de auditoría de registros en una base de datos
HTH.
Es una buena idea cuándo y si una eliminación no válida es absolutamente catastrófica y la recuperación debería ser simple. También es una buena idea si desea realizar un seguimiento de todo lo que alguna vez haya sido y "eliminar" realmente solo significa "ocultar". Es decir, depende de la situación.
Los borrados suaves también le permitirían revoke privilegios DELETE
de la cuenta de la base de datos utilizada por la aplicación.
No intentaré ser "políticamente correcto al respecto". Si defiende el borrado suave, entonces debe someterse a un chequeo cerebral.
1) Primero, ¿qué estás logrando exactamente al no eliminar las filas en la tabla? Solo el hecho de que en algún momento en el futuro puede acceder a esas filas, ¿verdad? Entonces, ¿por qué no simplemente crear una tabla de archivo y mover las filas allí? ¿Qué hay de malo con eso?
2) Con el borrado suave está creando una consulta innecesaria en is_active o consulta en alguna columna de sello de tiempo. Eso es solo basura cuando estarías escribiendo consultas más simples. Sí, funcionará con una vista, pero ¿las vistas no son un apéndice adicional? Cada vista es un SQL adicional, un costo de rendimiento adicional, en cualquier RDBMS comercial todo es solo una tabla. No hay nada mágico en las vistas, aparte del hecho de que no sabes cómo escribir consultas sobre las tablas.
3) Sí, funcionará con una Vista o MV. ¡Pero luego he visto consultas en producción haciendo FTS y todo sigue funcionando! Las maravillas del hardware moderno y el software sólido. Pero eso tampoco lo hace correcto. Entonces, con la misma lógica, solo porque funciona no significa que esté CORRECTAMENTE
4) Las complejidades de la eliminación suave nunca se detienen en una simple selección.
A) Supongamos que tiene una restricción ÚNICA. Ahora borra una fila, pero la columna con la restricción ÚNICA aún está allí. Cuando desee volver a agregar los mismos datos, no podrá hacer eso sin "trucos" adicionales.
B) Puede tener asociaciones que vayan de la Tabla A a la Tabla B y cuando borre algo de la Tabla A, debe asegurarse de que las consultas independientes en la Tabla B se encarguen de ese hecho. Supongamos que una página de detalles típica estaba trabajando en algún detalle_id.
Ahora un master_id se borra suavemente, pero todavía tiene enlaces permanentes con detail_id de ese master_id en todas partes. Cuando haces hard delete en master_id, esos detalles simplemente no existen. Ahora, con la eliminación suave, todavía existen y deben tener en cuenta el hecho de que su master_id está en modo de eliminación de software.
no se detendrá en una simple etapa Table_A.is_active = 0 o 1.
5) Hacer eliminaciones difíciles es simple y correcto.
A) Nadie tiene que agregar nada extra o preocuparse por nada en ninguna parte.
- Su lógica de aplicación es más simple
- Su base de datos es más pequeña
- Tus consultas son más rápidas
Solo archiva los datos + piezas relacionadas y deberías ser bueno.
Nunca es una mala idea evitar la posible pérdida de datos.
Siempre borro suavemente. En los casos en que la base de datos necesita borrarse de uno o más registros, generalmente utilizo un proceso de eliminación gradual en dos pasos y luego el vaciado de una "papelera de reciclaje" de registros, o un enfoque de estilo de gestión de documentos donde los registros de documentos pueden envejecer, y luego pasar por un proceso de aprobación antes de la eliminación definitiva.
Si vas a usar la eliminación suave, es una buena idea tener un campo fechada en lugar de un campo is_deleted. Obtienes una buena pieza de datos adicionales en lugar de solo el campo de bit.
Sin embargo, tiene un costo porque necesita actualizar sus consultas e índices para poder excluir las filas eliminadas.
Tal vez en lugar de alternar una bandera, muévala a otra mesa "papelera".
Además, podría decirse que es solo una solución parcial, ya que solo cubre las eliminaciones, pero cuando actualiza una fila, aún sobrescribe el valor anterior.
En general, yo diría que nunca borres nada a menos que realmente tengas que hacerlo. El espacio en disco es barato en estos días. Por supuesto, hay límites, hay datos que está legalmente obligado a borrar, hay datos que realmente no son tan importantes, y tal vez no es necesario que guardes los datos antiguos en línea y en la misma tabla (un archivo en alguna parte). también funcionaría).
Solo para agregar un centavo. Siempre borro suavemente; aunque cuesta el rendimiento, pero muy levemente. Piense en el costo cuando su cliente se queja con respecto a su software que dejó de funcionar después de realizar ciertas acciones que ni siquiera ella puede recordar. Bueno, este puede ser un gran ejemplo, pero nunca sabrías qué salió mal, quién hizo qué, qué fue antes y qué se insertó después. En ese caso, esto sería útil. Esta funcionalidad es útil para fines de auditoría, y muchos clientes solicitan informes de auditoría de este tipo.
Además, en la mayoría de las aplicaciones basadas en flujo de trabajo, se presenta como una función / requisito de software que el cliente está interesado en las "acciones" realizadas en un elemento de trabajo; qué valores se asignaron y quién lo procesó, etc.
Soy un fanático de los borrados suaves. Principalmente para evitar eliminaciones en cascada. Sin embargo, se necesita un código adicional para que, si está SELECCIONANDO un objeto secundario, se una a los objetos principales (¡y a todos los padres!) Para asegurarse de que ninguno de ellos se elimine. Alternativamente, puede conectar en cascada el borrado suave, pero si desea restaurarlos más tarde, es posible que no sepa qué niños ya se han eliminado y cuáles se eliminaron debido a la cascada.
Además, conservo un nombre de fecha y hora de revisión de revisión en cada objeto, de modo que sé quién modificó (o borró) en último lugar. Luego, para un seguimiento de auditoría, creo una tabla * Historial (como CustomerHistory) que se inserta después de cada ACTUALIZACIÓN a la tabla original. De esta forma, después de que un objeto es modificado o borrado, tengo un registro de quién realizó la acción, así como el último estado conocido del objeto.
Uno de los principales problemas para la eliminación suave es que los datos no deseados afectarán potencialmente el rendimiento de la base de datos. Hace varios años, uno de mis clientes me pidió que borrara todos los elementos de la base de datos, mi solución es mover todos los elementos "eliminados" a una tabla de respaldo, en lugar de dejarlos en las tablas actuales.
en Oracle, si agrega la clave principal a una tabla recycle_bin que usted compone, luego agregue una política de seguridad de nivel de fila, puede suprimir los valores de todas las consultas cuando la fila está en la papelera de reciclaje, eliminará el pk de la papelera de reciclaje restaurar automáticamente todos los datos. no es necesario cambiar sus otras consultas para acomodar la lógica.