Formas de tener un historial de cambios en las entradas de la base de datos

14

¿Cuáles son las formas de permitir el control de versiones de las entradas de la base de datos (datos)?

Piense en las capacidades de los sistemas de gestión de contenidos para revertir los cambios de los artículos.

¿Cuáles son sus pros / contras?

    
pregunta matcauthon 10.07.2012 - 07:27

7 respuestas

12

Hay básicamente dos enfoques: una tabla de auditoría, con todos los valores anteriores almacenados en ella, o incluyen una fecha de inicio / finalización como parte de la tabla, y todas las actualizaciones crean un nuevo registro al cerrar el anterior.

    
respondido por el jmoreno 10.07.2012 - 08:07
5

La idea detrás es usar Insert Only Databases . La idea básica es que never update or update data on a row. . Cada tabla que se requiere para realizar un seguimiento tendrá 2 columnas de fecha y hora desde y hacia.

Empiezan con el valor nulo en cada una (principio de tiempo al final del tiempo)

Cuando necesite change la fila, agregue una nueva fila, al mismo tiempo que actualice en la fila anterior a Ahora y la de la fila que está agregando a Ahora.

Para obtener información más detallada, consulte la publicación - ¿Cuál es el mejor diseño de base de datos para administrar información histórica .

    
respondido por el EL Yusubov 10.07.2012 - 11:51
2

Creo que puede usar los activadores para cada tabla y mantener los datos en la historia (o puede dar cualquier nombre) y en cada inserción, actualizar, eliminar en la tabla principal activará su activador y puede guardar los detalles en esta tabla El mecanismo de activación también está disponible con la base de datos SQLite si está utilizando una.

Este mecanismo es útil también para proyectos grandes. En esta tabla puede registrar información del usuario que ha realizado los cambios junto con la marca de tiempo de los cambios. luego puede restaurar su tabla a cualquiera de las marcas de tiempo que coincidan con sus requisitos.

Cada base de datos tiene su propia forma de escribir y codificar activadores. Si está utilizando SQLite, visite SQLite.org para obtener la sintaxis. Para otras bases de datos puedes visitar sus sitios oficiales.

    
respondido por el Chaitanya 10.07.2012 - 13:04
1

Probablemente esté al tanto del motor de db Sqlite . Toda la base de datos se guarda en un solo archivo. La API también admite sistemas de archivos virtuales, así que básicamente puede organizar el almacenamiento en cualquier lugar y con cualquier formato, solo responda a las operaciones de lectura y escritura en las compensaciones de archivos particulares. Las posibles aplicaciones para esto podrían ser el cifrado, la compresión, etc. La mejor parte de esto es que la capa de contenedor no debe saber nada sobre las bases de datos, el formato de archivo sql o sqlite, solo obedece las devoluciones de llamada xRead y xWrite.

Una de las ideas fue implementar la función de máquina del tiempo. Por lo tanto, cualquier operación de xWrite guarda todos los segmentos que sobrescribiría en el historial de "deshacer" y el usuario puede elegir una fecha en el pasado para ver qué contenía la db (probablemente el modo de solo lectura). Todavía no tengo un ejemplo práctico (hubo una discusión al respecto en lista de correo de sqlite), pero probablemente otros motores suministran API de VFS, por lo que es posible algo similar. Y una vez implementado, debe ser compatible con estructuras de bases de datos de cualquier complejidad.

    
respondido por el Maksee 10.07.2012 - 10:49
1

El método que usamos para versionar las entradas de la base de datos es usar una tabla de auditoría. La tabla tiene un esquema a lo largo de las líneas de:

Seq      - Int      ' Unique identifier for this table
Event    - Char     ' Insert / Update / Delete
TblName  - Char     ' Table that had field value changed
FldName  - Char     ' Field that was changed
KeyValue - Char     ' delimited list of values for fields that make up the PK of table changed
UsrId    - Char     ' User who made the change
OldValue - Char     ' Old value (converted to character)
NewValue - Char     ' New value (converted to character)
AddTs    - DateTime ' When the change was made

Luego tenemos activadores en Insertar / Actualizar / Eliminar de las tablas que queremos rastrear.

Pros:

  • Todos los datos están en una tabla
  • Se puede configurar para realizar un seguimiento de todos los campos o campos específicos en una tabla
  • Es fácil mostrar el control de versiones en cada campo para una tabla

Contras:

  • Tener toda la información de auditoría en una tabla da como resultado un número extremadamente grande de registros
  • Se necesitan muchos disparadores
respondido por el briddums 10.07.2012 - 16:45
0

Estoy haciendo una versión de esto ahora. para cada registro tengo una fecha insertada, una fecha modificada y un indicador booleano Registro activo. Para las inserciones iniciales, las fechas Insertadas y Modificadas se establecen en Ahora () (este ejemplo está en Acceso) y el indicador Registro activo se establece en true . luego, si modifico ese registro, copio todo a un nuevo registro, cambiando los campos que el usuario está cambiando, dejo la fecha de inserción igual al original y cambio la fecha de modificación a Ahora (). Luego, cambio el indicador Registro activo del registro original a false y el nuevo registro a true . También tengo un campo para ModifiedRecordsParentID donde guardo la identidad del registro original.

Luego, si incluso necesito consultar, puedo devolver los registros donde ActiveRecord = true y solo obtendré la información más actualizada.

    
respondido por el Brad 10.07.2012 - 13:57
0

también, si desea almacenar TODOS los cambios en la base de datos a lo largo del tiempo, es posible que desee revisar el registro ( enlace )

    
respondido por el Sabrina Gelbart 11.06.2015 - 03:02

Lea otras preguntas en las etiquetas