Borrado blando

4 Mar

Emplando una herramienta como DBIx::Class con un mecanismo de marcas de borrado en una base de datos relacional.

Estamos a punto de diseñar una base de datos ó una parte de una y nos encontramos en el momento en el que debemos afrontar el problema del borrado de entidades de datos. Las especificaciones dicen que tiene que ser posible deshacer cualquier operación de borrado en este tipo de datos, entidades básicas principalmente, y queremos diseñar un mecanismo que se encargue de ello sin complicar el mantenimiento de la aplicación ni su crecimiento.

La primera búsqueda en la red nos lleva a algunos hilos y una bitácora muy interesantes que tratan el asunto y donde se proponen varias ideas, aunque la destacable a mi juicio es la que incluye una columna extra, tipo conmutador lógico, que señale si la fila está borrada o no. Para que funcione será necesario tener en cuenta su valor en todas las búsquedas, así como en las operaciones de creación y actualización de filas.

Pongamos por caso que definimos una tabla así:

  1. CREATE TABLE divisas (
  2. divisa char(3) PRIMARY KEY,
  3. nombre varchar(100) NOT NULL,
  4. valor numeric(12,2) NOT NULL,
  5. _deleted bool DEFAULT false
  6. );

Cualquier búsqueda deberá añadir una claúsula especial como en:

  1. my $rs = Alejandria->resultset('Divisas')->search( { _deleted => 0 } );

Y será también necesario cambiar los métodos de borrado como en:

  1. sub delete {
  2. my $self = shift;
  3.  
  4. return $self->update({ _deleted => 1 });
  5. }

Inconvenientes

  1. Dado que usamos un identificador común como clave primaria no podremos volver a usarlo nunca porque existirá aunque lo hayamos borrado. Esto es, si decidimos borrar la libra chipriota cuyo identificador es CYP, éste no será reutilizable nunca a menos que el borrado sea real porque una clave primaria es por definición un índice único.
  2. La base de datos seguirá teniendo el mismo nivel de carga borremos lo que borremos al no desaparecer físicamente los datos.
  3. Las tareas de mantenimiento de la base de datos precisarán código extra y muy directo.

Ventajas

  1. Existe la posibilidad de resucitar datos muy rápidamente.
  2. Se mantiene la integridad referencial al no eliminarse las filas realmente.