Desarrollar base de datos con históricos (Auditorías)

03/09/2004 - 11:57 por Lara | Informe spam
Hola grupo!

He diseñado una base de datos para una aplicación que gestiona seguros de
coches. Cada vez que modifico un registro, actualizo un campo llamado
FechaModificación para saber cuándo fué la última vez que modifiqué dicho
registro. Todas las tablas de la base de datos tienen este campo
FechaModificación.

El problema viene porque necesito "rediseñar" la base de datos para que me
almacene todas las modificaciones que se van a realizar sobre los datos, no
me basta con conocer la FechaModificacion, sino que necesito conocer los
datos que había en cada momento...de tal manera, que por ejemplo, un usuario
de la aplicación pueda visualizar los datos de una póliza de seguros hace 2,
3, 4 meses...

Estoy pensando cómo diseñar la base de datos para que me guarde toda esta
información y que mis datos mantengan la integridad.

Una forma podría ser duplicando cada tabla. Tabla1-Tabla1_Historico;
Tabla2->Tabla2_Historico. Y cada vez que modifique un registro, modificar
e insertar datos en todas las tablas del histórico que tengan relación con
ésta.

Otra forma podría ser, relacionar los datos de una tabla y los datos
modificados de esa misma tabla, mediante un árbol, en el que hay un registro
"padre" y varios registros "hijos" que dependen de él y que contendrá el
registro modificado con su FechaModificación.
Os pongo un ejemplo para ver si se entiende mejor:

Tabla: TipoPoliza

IdTipoPoliza IdPadre Descripcion FechaModificacion
1 0 Poliza1 01/09/2004
2 0 Poliza2 01/09/2004
3 1 Poliza1.1 05/09/2004
4 1 Poliza1.2 02/10/2004
..

En el ejemplo, se ve que la "Poliza1" es modificada dos veces, y como el
IdTipoPoliza es el número 1, en el IdPadre de Poliza1.1 y Poliza1.2 aparace
el 1.

De esta forma, y filtrando por la FechaModificacion, siempre puedo saber
cómo se denominaba el TipoPoliza en diferentes fechas..

Añado al ejemplo una tabla Poliza que va a tener un IdTipoPoliza

Tabla: Poliza

IdPoliza IdPadre Descripcion IdTipoPoliza
FechaModificacion
1 0 Descripcion Poliza1 1
01/09/2004


En cuanto modifique el registro 1 de la tabla TipoPoliza, debería modificar
también la tabla Póliza, para guardar ese cambio, ya que la Poliza con
identificador 1, tiene como TipoPoliza el identificador 1, y como el
05/09/2004 ha sido modificado su descripción de Poliza1 a Poliza1.1, lo que
yo añadiría en la tabla Poliza sería lo siguiente:

Tabla: Poliza

IdPoliza IdPadre Descripcion IdTipoPoliza
FechaModificacion
1 0 Descripcion Poliza1 1
01/09/2004
2 1 Descripcion Poliza1 3
05/09/2004


Espero que se entienda en qué consiste esta segunda forma de guardar un
histórico de cambios..

Lo que me gustaría es que me dierais vuestra opinión, sobre si alguna de
esta formas es óptima, o bien, que me enviárais algún link con información
sobre este tema.

Muchísimas gracias! Siento no tener mucho tiempo para explicar mejor el
problema

Saludos!
Lara
 

Leer las respuestas

#1 qwalgrande
03/09/2004 - 12:23 | Informe spam
Hola.

Te voy a dar mi opinión basada en una experiencia parecida que se me
presentó no hace mucho.

La primera de las opciones es más fácil de implementar y sobre todo más
fácil de explotar. Las estructuras en árbol, a la larga, complican la
existencia sobre manera, sobre todo para realizar consultas. Almacenar
cambios en histórico puedes hacerlo incluso con triggers, aunque yo lo haría
con procedimientos almacenados, es decir, aprovecharía los procedimientos
almacenados de alta, borrado y modificación para incluir la grabación en el
histórico. También entiendo que si desde el inicio no optaste por el uso de
procedimientos almacenados, ahora quizá te sea mucho más cómodo usar
triggers. Plantéatelo de todos modos.

Otra cosa que facilita mucho la primera opción (además de permitirte
independizar los datos que valen de los que sólo son histórico) es el
necesario mantenimiento que todo histórico precisa. Debes plantearte que cada
cierto tiempo, esas tablas de log hay que aligerarlas, llevarlas a otra bd,
hacer backup y borrar, en fin, lo que tú veas.

qwalgrande.

Preguntas similares