2009-02-03 12 views
11

SQL siempre ha tenido una gran característica: elimina en cascada. Lo planifica con anticipación y cuando es hora de eliminar algo, ¡BAM! No hay necesidad de preocuparse por todos esos registros dependientes.Cascading Soft Delete

Sin embargo, hoy en día es casi tabú eliminar realmente algo. Usted lo marca como eliminado y deja de mostrarlo. Desafortunadamente, no he podido encontrar una solución sólida para hacer esto cuando hay registros dependientes. Siempre he codificado manualmente la complicada red de eliminaciones suaves.

¿Existe alguna solución mejor que haya echado de menos por completo?

Respuesta

13

Odio decirlo, pero los desencadenantes están diseñados específicamente para este tipo de cosas.

(La parte odio se debe a las buenas desencadenantes son muy difíciles de escribir y, por supuesto, no se pueden depurar)

0

No estoy seguro que backend que está hablando, pero se podía recogida en su "bandera de eliminar" cambiando y conectando en cascada el cambio con un gatillo.

6

Las restricciones de clave externa pueden hacer actualizaciones en cascada. Si vinculó sus tablas tanto en la tecla como en la bandera de eliminación, cuando la marca de eliminación en la tabla maestra cambió, ese cambio se propagaría hacia abajo a la tabla de detalles. No lo he intentado, pero debería funcionar.

+0

Esto es IMO increíblemente elegante. El único problema al hacerlo es que no puede usar un NULL Delete_Date, sino que debe usar una fecha arbitraria como '9999-12-31'. – HaxElit

+1

Después de pensar un poco más, no funciona porque si borras un registro dependiente, obtienes un error de restricción de clave porque la fecha de eliminación del padre es diferente. Para bien ser cierto, supongo;) – HaxElit

2

Creo que una de las ventajas de las eliminaciones suaves es que no todas las tablas tienen una marca de borrado suave, por lo que la cantidad de elementos necesarios para la conexión en cascada es poca. Las filas simplemente no se utilizan en la base de datos, pero no se quedan huérfanas; simplemente se las refiere a filas eliminadas.

Como todo, sin embargo, depende de su modelo.

+0

Hmm, pero luego tienes una base de datos llena de filas sin ver de inmediato que se usa, ¿no? Podrías unirte a la mesa principal, pero si la cascada tiene varios niveles de profundidad, podría ser complicado. ¿O me estoy perdiendo algo? – Piskvor

+1

Depende del modelo. En un diseño relacional, si una bandera eliminada no pertenece a la relación/tupla/tabla, es decir, no es un atributo de la clave, no pondría una. En un esquema en estrella, los pondría solo en las tablas centrales. –

+0

Si da un ejemplo de un esquema de un subsistema, le mostraré cuáles pondría un indicador borrado. Por ejemplo, nunca los colocaría en una tabla de muchos a muchos, a menos que mantenga el historial de cambios de ligamiento, en cuyo caso, también debería agregar fechas efectivas. –