Agregar una dimensión de time a las celdas de MySQL

¿Hay alguna manera de mantener un logging con timestamp de cada cambio en cada columna de cada fila en una tabla MySQL? De esta forma, nunca perdería ningún dato y mantendría un historial de las transiciones. La eliminación de fila podría ser simplemente establecer una columna "eliminada" en verdadero, pero sería recuperable.

Estaba buscando en HyperTable , una implementación de código abierto de BigTable de Google, y esta característica realmente mojó mi boca. Sería genial si pudiera tenerlo en MySQL, porque mis aplicaciones no manejan la gran cantidad de datos que justificarían la implementación de HyperTable. Se pueden ver más detalles sobre cómo funciona esto aquí .

¿Hay alguna configuration, complemento, fork o lo que sea que agregue solo esta funcionalidad a MySQL?

Lo he implementado en el pasado en un model php similar al descrito en el caos.

Si está utilizando mysql 5, también puede lograr esto con un procedimiento almacenado que enganche en la actualización y en eliminar events de su tabla.

http://dev.mysql.com/doc/refman/5.0/en/stonetworking-routines.html

Lo hago en un marco personalizado. Cada definición de tabla también genera una tabla de logging relacionada de varios a uno con la tabla principal, y cuando el marco realiza alguna actualización de una fila en la tabla principal, inserta el estado actual de la fila en la tabla de logging. Así que tengo un seguimiento de auditoría completo sobre el estado de la tabla. (Tengo loggings de time porque todas mis tablas tienen columnas LoggedAt).

No hay plugins, me temo, más un método de hacer las cosas que debe integrarse en toda la metodología de interacción de la database.

Crea una tabla que almacene la siguiente información …

CREATE TABLE MyData ( ID INT IDENTITY, DataID INT ) CREATE TABLE Data ( ID INT IDENTITY, MyID INT, Name VARCHAR(50), Timestamp DATETIME DEFAULT CURRENT_TIMESTAMP) 

Ahora crea un sproc que hace esto …

 INSERT Data (MyID, Name) VALUES(@MyID,@Name) UPDATE MyData SET DataID = @@IDENTITY WHERE ID = @MyID 

En general, la tabla MyData es solo una tabla key. A continuación, apunte al logging en la tabla de datos que es el más reciente. Cada vez que necesite cambiar datos, simplemente llame al sproc que Inserta los nuevos datos en la tabla de Datos, luego actualiza los MyData para señalar el logging más reciente. Todo si las otras tablas en el sistema se desconectaran del MyData.ID para propósitos de key externa.

Esta disposition deja de lado la necesidad de una segunda tabla de logging (y mantenerlos sincronizados cuando cambia el esquema), pero a costa de una unión extra y un poco de sobrecarga al crear nuevos loggings.

¿Necesitas que siga siendo consultable, o solo será para la recuperación de malas ediciones? Si es lo último, podría simplemente configurar un trabajo cron para hacer una copy de security de los files reales donde MySQL almacena los datos y enviarlos a un server de control de versiones.

    Intereting Posts