Cada vez que necesito diseñar una nueva base de datos, paso bastante tiempo pensando en cómo debo configurar el esquema de la base de datos para mantener un registro de auditoría de los cambios.
Ya se han hecho algunas preguntas sobre esto, pero no estoy de acuerdo en que haya un mejor enfoque para todos los escenarios:
- Diseño de bases de datos para revisiones
- El mejor diseño para una tabla de base de datos de auditoría de registro de cambios
- Ideas sobre diseño de bases de datos para capturar pistas de auditoría
También me topé con este interesante artículo sobre Mantener un registro de cambios en la base de datos que intenta enumerar los pros y los contras de cada enfoque. Está muy bien escrito y tiene información interesante, pero ha hecho que mis decisiones sean aún más difíciles.
Mi pregunta es: ¿Hay alguna referencia que pueda usar, tal vez un libro o algo así como un árbol de decisión al que pueda referirme para decidir qué camino tomar en función de algunas variables de entrada, como:
- La madurez del esquema de la base de datos.
- Cómo se consultarán los registros
- La probabilidad de que sea necesario volver a crear registros
- Lo que es más importante: escribir o leer el rendimiento
- Naturaleza de los valores que se registran (cadena, números, blobs)
- Espacio de almacenamiento disponible
Los enfoques que conozco son:
1. Agregue columnas para la fecha y el usuario creados y modificados
Ejemplo de tabla:
- carné de identidad
- valor_1
- valor_2
- valor_3
- Fecha de creación
- fecha_modificada
- creado por
- modificado por
Contras principales: perdemos la historia de las modificaciones. No se puede revertir después de confirmar.
2. Insertar solo tablas
- carné de identidad
- valor_1
- valor_2
- valor_3
- de
- a
- eliminado (booleano)
- usuario
Contras principales: ¿Cómo mantener actualizadas las claves extranjeras? Enorme espacio necesario
3. Cree una tabla de historial separada para cada tabla
Ejemplo de tabla de historial:
- carné de identidad
- valor_1
- valor_2
- valor_3
- valor_4
- usuario
- eliminado (booleano)
- marca de tiempo
Contras principales: necesita duplicar todas las tablas auditadas. Si el esquema cambia, también será necesario migrar todos los registros.
4. Crear una tabla de historial consolidado para todas las tablas
Ejemplo de tabla de historial:
- nombre de la tabla
- campo
- usuario
- nuevo valor
- eliminado (booleano)
- marca de tiempo
Contras principales: ¿Podré recrear los registros (revertir) si es necesario fácilmente? La columna new_value debe ser una cadena enorme para que pueda admitir todos los tipos de columnas diferentes.