Necesito hacer un seguimiento de los elementos eliminados para las necesidades de sincronización del cliente.
En general, ¿es mejor agregar una tabla de lápidas y un disparador que rastrea cuando se eliminó una fila de la base de datos del servidor, básicamente agregando una nueva fila a la tabla de lápidas con los datos del elemento eliminado, o para mantener los elementos en el tabla original y marcarlos como eliminados, generalmente con una columna de tipo bit, para indicar que se elimina una fila y otra columna para rastrear cuando se produjo la eliminación.
Tal vez deberías combinar los dos métodos a propósito. Por qué ???
Usemos esa tabla (dialecto MySQL)
Tenga en cuenta que, con la excepción de la CLAVE PRIMARIA, cada índice que haga debe ir precedido por la
deleted
bandera y terminar conid
.Creemos la tabla de lápidas
Si su tabla ya tiene una
deleted
bandera, puede llenar la tabla tommstoneBien, ahora los datos y la lápida están preparados. ¿Cómo se realizan las eliminaciones?
Supongamos que está eliminando a todas las personas en el código postal 07305. Ejecutarías lo siguiente:
OK, esto parece un montón de gastos generales de cualquier manera que lo mires.
Ahora, ¿quieres ver todos los datos eliminados? Aquí hay dos formas diferentes:
SELECT * FROM mydata WHERE deleted=1;
SELECT B.* FROM mytomb A INNER JOIN mydata B USING (id);
Si el número de identificadores en mytomb es mayor al 5% del número de filas de mydata, es un escaneo completo de la tabla. De lo contrario, una exploración de índice con una búsqueda para cada fila. Tenga en cuenta los puntos de referencia a este respecto. Busque los planes de explicación.
Ahora, ¿quieres ver a todas las personas en el código postal 07304? Aquí hay dos formas diferentes:
SELECT * FROM mydata WHERE deleted=1 AND zipcode='07304';
SELECT A.* FROM mydata A LEFT JOIN mytomb B USING (id) WHERE B.id IS NULL AND A.zipcode='07304'
¿Qué hay de las eliminaciones masivas? Aquí hay dos formas diferentes:
DELETE FROM mydata WHERE deleted=1;
DELETE B.* FROM mytomb A INNER JOIN mydata B USING (id); DELETE FROM mytomb;
CONCLUSIÓN
Ahora, no estoy diciendo que conserve ambos métodos. Hacer esto con el tiempo revela qué método es más rápido en términos de operabilidad general. Debe decidir qué puntos de referencia para consultar datos en vivo, consultar datos eliminados y eliminaciones masivas funcionan mejor para usted.
fuente