Base de datos: borrar o no borrar registros

117

No creo que sea la única persona que se pregunta esto. ¿Qué suele practicar sobre el comportamiento de las bases de datos? ¿Prefieres eliminar un registro de la base de datos físicamente? ¿O es mejor marcar el registro con una marca de "eliminado" o una columna booleana para indicar que el registro está activo o inactivo?

jerbersoft
fuente
67
... si es más noble en la base de datos sufrir la hinchazón y la redundancia de las banderas, o llevar DELETE a una tabla de registros, y eliminarlos, terminarlos. Eliminar, dormir;
nickf
7
¡Oye! ¿Cómo puedo votar un comentario?
Nifle

Respuestas:

48

Definitivamente depende del contenido real de su base de datos. Si lo está utilizando para almacenar información de la sesión, límpielo inmediatamente cuando la sesión expire (o se cierre), no querrá que la basura se quede por ahí. Ya que realmente no se puede volver a utilizar con fines prácticos.

Básicamente, lo que debe preguntarse, ¿podría necesitar restaurar esta información? Al igual que las preguntas eliminadas en SO, definitivamente deberían estar marcadas como 'eliminadas', ya que permitimos activamente una recuperación. También tenemos la opción de mostrarlo a usuarios seleccionados, sin mucho trabajo adicional.

Si no está buscando activamente restaurar por completo los datos, pero aún así le gustaría conservarlos para fines de monitoreo (o similares). Le sugiero que descubra (en la medida de lo posible, por supuesto) un esquema de agregación y lo lleve a otra mesa. Esto mantendrá su tabla principal limpia de datos 'eliminados', así como también mantendrá su tabla secundaria optimizada para propósitos de monitoreo (o lo que sea que tenga en mente).

Para obtener datos temporales, consulte: http://talentedmonkeys.wordpress.com/2010/05/15/temporal-data-in-a-relational-database/

falstro
fuente
30

Ventajas de usar una bandera de eliminación:

  1. Puede recuperar los datos más tarde si los necesita,
  2. La operación de eliminación (actualizar la bandera) es probablemente más rápida que eliminarla realmente

Contras de usar una bandera de eliminación:

  1. Es muy fácil perderse AND DeletedFlag = 'N'en algún lugar de su SQL
  2. Más lento para que la base de datos encuentre las filas que le interesan entre toda la basura
  3. Eventualmente, probablemente querrá eliminarlo de todos modos (suponiendo que su sistema sea exitoso. ¿Qué pasa cuando ese registro tiene 10 años y fue "eliminado" 4 minutos después de su creación original)
  4. Puede hacer que sea imposible utilizar una clave natural. Puede tener una o más filas eliminadas con la clave natural y una fila real que desee usar esa misma clave natural.
  5. Puede haber razones legales / de cumplimiento por las que debe eliminar datos.
WW.
fuente
23

Como complemento a todas las publicaciones ...

Sin embargo, si planea marcar el registro, es bueno considerar hacer una vista, para registros activos. Esto le evitaría escribir u olvidar la bandera en su consulta SQL. También puede considerar una vista para registros no activos, si cree que también tiene un propósito.

Adeel Ansari
fuente
11

Me alegro de haber encontrado este hilo. Yo también me preguntaba qué pensaba la gente sobre este tema. He implementado el "marcado como eliminado" durante unos 15 años en muchos sistemas. Cada vez que un usuario llamaba para decir que algo se eliminó accidentalmente, ciertamente era mucho más fácil marcarlo como no eliminado que volver a crearlo o restaurarlo desde una copia de seguridad.

Estamos usando postgresql y Ruby on rails, parece que podríamos hacer esto de una de dos maneras, modificar los rieles o agregar un disparador ondelete y en su lugar, hace una función pl / pgsql para marcar como eliminado. Me estoy inclinando hacia lo último.

En cuanto a los impactos de rendimiento, será interesante ver los resultados de EXPLAIN-ANALYZE en tablas grandes para pocos elementos eliminados, así como muchos elementos eliminados.

En los sistemas usados ​​a lo largo del tiempo que he descubierto, los nuevos usuarios tienden a hacer cosas tontas como eliminar cosas accidentalmente. Entonces, cuando las personas son nuevas en un puesto, tienen todos los derechos de acceso de la persona que estuvo anteriormente en ese puesto, excepto con cero experiencia. Eliminar algo accidentalmente y poder recuperarse rápidamente hace que todos vuelvan a trabajar rápidamente.

Pero como alguien dijo, a veces es posible que necesite esa clave en particular por alguna razón, en ese momento necesitaría eliminarla realmente, luego volver a crear los registros (al recuperarla y modificar el registro).

usuario67403
fuente
1
+1 porque la facilidad de uso incluye limitar mi capacidad para cometer errores catastróficos.
Jesse
6

También existen problemas legales de cualquier manera si se trata de datos personales. Creo que depende en gran medida de dónde se encuentre (o dónde esté la base de datos) y cuáles son los términos de uso.

En algunos casos, las personas pueden solicitar ser eliminadas de su sistema, en cuyo caso se necesita una eliminación completa (o al menos borrar toda la información personal).

Verificaría con su departamento legal antes de adoptar una estrategia de cualquier manera si hay información personal involucrada.

Jeremy francés
fuente
5

Los marco como eliminados y no los elimino realmente. Sin embargo, de vez en cuando barro toda la basura y la archivo, para que no mate el rendimiento.

Robert Gould
fuente
2

Si le preocupa que los registros "inactivos" ralenticen el acceso a la base de datos, es posible que desee mover esas filas a otra tabla que actúe como una tabla de "archivo".

crucero
fuente
1

Para los datos ingresados ​​/ administrados por el usuario, he usado el método de marca que usted describe y le he dado al usuario una interfaz de "vaciar la papelera" para eliminar elementos si así lo desea.

Abie
fuente