2010-11-18 15 views
8

Estoy construyendo tablas de auditoría para mi base de datos y necesito elegir qué estilo implementar. Actualmente estoy considerando tres opciones, todas las cuales se completarán con los activadores:estructura de tabla de auditoría

  1. Una sola tabla con los campos id | mesa | columna | fila | old_value | new_value | marca de tiempo | identidad de usuario. Esto haría un seguimiento de todos los cambios en todas las tablas en un solo lugar y tiene el beneficio de minimizar el número de tablas. Hace las consultas un poco difíciles, pero no imposibles.
  2. Múltiples tablas como # 1, excepto sin la columna de la tabla. Esto separaría los cambios de cada tabla en su propia tabla de historial.
  3. Múltiples tablas que reflejan el esquema de las tablas originales para rastrear. Esto facilitaría la escritura de los factores desencadenantes, facilitaría la restauración de los datos si alguien quisiera volver a un registro específico, pero vendría a expensas del almacenamiento, ya que cada campo, incluso si no hubiera cambiado, lo haría ser duplicado, posiblemente varias veces. Además, sería difícil saber específicamente qué campos cambiaron de una versión a la siguiente.

Cada una de estas tres opciones es factible, y por lo que yo sé, no hay una funcionalidad que se ofrece que es imposible en otra. Entonces debe haber algo que no estoy considerando o algún patrón que sea más estándar. Si hace alguna diferencia, esta solución debe funcionar para ambos servidores, mysql y sql (aunque puedo resolver los detalles del código más adelante).

+0

Implemento una versión del número 3. En SQL Server, el activador puede identificar cada columna que se ha modificado. Guardo eso junto con toda la fila que se modifica + algunas columnas específicas de auditoría (auditdatetime, userinfo, etc.). Guardo el hash, pero creo una vista que decodifica el hash y enumera las columnas afectadas. – datagod

Respuesta

5

Las tablas de auditoría se ven afectadas muy fuertemente, no desea solo una tabla para todas las auditorías u obtendrá bloqueos.

Hacemos algo así como el número dos, excepto que tenemos dos tablas por tabla (una que almacena las instancias de cambios y otra que almacena los datos reales. Esto hace que sea fácil encontrar todos los registros almacenados en una importación de registros amillion por ejemplo, ya que todos son en la misma instancia. Esto significa que podemos crear fácilmente nuevas tablas de auditoría a medida que se agregan nuevas tablas.

En el caso de la segunda, sugeriría escribir un procedimiento para restaurar un registro específico la restauración es fácil y no tiene que resolverlo cada vez.

+0

HLGEM hace un buen punto. Romperlo por motivos de rendimiento tiene mucho sentido y si tiene muchas lecturas/escrituras (millones por día) o grandes actualizaciones por lotes, entonces la solución de HLGEM es buena.Sin embargo, si sus necesidades no son tan altas, entonces la opción número 1 es un buen compromiso entre rendimiento y mantenimiento. Las bases de datos pueden manejar mucho y exagerar la optimización puede ser un error dependiendo de la situación. – theChrisKent

+0

oh, entonces si un usuario actualiza 5 campos de una fila, entonces una tabla obtiene una nueva instancia de cambio, y otra tabla obtiene 5 nuevas filas de actualizaciones, todas vinculadas a esa instancia. Eso hace que restaurar sea más fácil. –

+0

@Bob Baddeley, sí. – HLGEM

0

Elegiría el número 1 con la mano hacia abajo. El número 2 sería difícil de mantener si decide agregar campos adicionales a su seguimiento y agrega muy poco además de eliminar la necesidad de una tabla WHERE =? cláusula. El número 3 es exagerado. Para eso están las copias de seguridad.

1

No hay respuesta, solo otras preguntas: ¿Para qué sirve su tabla de auditoría? m, o tiene que tenerlos? ¿Cómo se usarán, qué preguntas responderán o qué situaciones abordarán? ¿Con qué frecuencia o con poca frecuencia se usarán? ¿Cuánto tiempo debe mantener estos datos disponibles, y cómo va a purgarlos o archivarlos después de la fecha de vencimiento?

Las dos respuestas anteriores [theChrisKen, HLGEM] no coinciden, sin embargo, según lo que han trabajado antes, apostaría a que ambas son correctas. Si considera cómo serán utilizados y los requisitos de rendimiento de ese uso, eso puede ayudarlo a determinar qué modelo es mejor para su situación.

+0

Se usarán para 1) notificaciones de cambios a los usuarios suscriptores (en una frecuencia instantánea, diaria, semanal o mensual) 2) mostrar una tabla de cambios en un registro junto al registro en sí 3) volver a una revisión anterior si los cambios son incorrectos o inapropiados Los datos forman parte del registro y nunca se purgan. Puedo ver cómo tanto elChrisKen como HLGEM encontrarían sus soluciones apropiadas en diferentes condiciones. Esperamos una solución que se adapte bien, aunque no superará los pocos cientos de usuarios (<50 a la vez) o unos miles de filas para rastrear. –

Cuestiones relacionadas