2009-09-30 9 views
6

tengo esquema de base de datos para un proyecto de integración en el que tengo que ser capaz de consultar para los registros que tienen cambió, pero sólo basado en una dado conjunto de campos dentro de ese registro.La implementación de un hash de registro de base de datos para hacer el seguimiento de si un registro ha cambiado o no

Así, por ejemplo, he aquí una tabla de ejemplo:

CLIENTES

  • ID
  • Nombre
  • Teléfono
  • Fax
  • Equilibrio

Necesito hacer una consulta para recuperar registros cuyos campos Nombre, Teléfono o Fax hayan cambiado. Sin embargo, otros campos no deben tenerse en cuenta, es decir, si solo el campo Balance cambia, mi consulta no debería extraer ese registro (por lo tanto, un campo de marca de tiempo que se actualiza automáticamente cada vez que se modifica el registro no funciona)

Además, esto tiene que ejecutarse en una cantidad de bases de datos y plataformas diferentes, por lo que los GATILLOS o algo similar no son realmente una opción a menos que se ejecuten en MySQL, PostgreSQL, SQL Server y SQLLite.

Los campos son modificados por una aplicación de terceros que no puedo modificar, por lo que no puedo agregar un indicador y hacer que la aplicación de terceros establezca el indicador en VERDADERO siempre que modifique un campo relevante.

Mi solución inicial a esto es calcular un HASH de los campos relevantes y almacenarlo en un nuevo campo 'LastHash' o algo así. Luego, puedo calcular el hash de los campos relevantes para los datos actualmente en el registro, y si no coincide con el LastHash almacenado, sé que ha cambiado.

Eso parece bastante complicado ... pero parece que va a trabajar. ¿Hay una mejor manera? Si no, ¿hay una buena manera de implementar ese hash así que es eficiente y no consume mucho tiempo extraer esos registros modificados?

EDITAR

Algunas aclaraciones: Tanto mi solicitud y la otra actualización de la aplicación y se insertan en estas tablas. I puede hacer que mi aplicación calcule el hash inicial. Sin embargo, no puedo hacer que la otra aplicación lo calcule.

columnas de marca de hora que se actualizan automáticamente cada vez que un récord de cambios son factible, aquellos son bastante fáciles de replicar en todos los sistemas de bases de datos utilizando diferentes tipos de columna o desencadenantes muy simples.

PREGUNTA ADICIONAL

Si hash es el camino a seguir ... ¿hay algún tipo de algoritmo de control eficiente que no tomará por siempre para el cálculo de todos estos registros? MD5 o SHA1 podrían funcionar, pero parece que serían sllloowwww.

+1

¿Cómo insertar/actualizar ese hash sin el uso de disparadores o modificando la aplicación que hace los insertos? –

+0

EDITAR: Puedo hacer que mi aplicación calcule el hash inicial. Sin embargo, no puedo hacer que la otra aplicación lo calcule. –

Respuesta

2

Esa es una pregunta difícil. Todavía tendrá que escanear tablas (o escanear índices), ya que USTED tiene que calcular el nuevo hash y compararlo con el viejo hash almacenado.

Si los desencadenadores no son posibles debido a problemas de plataforma cruzada, es posible que el motor de la base de datos pueda calcular el hash actual (es decir, la columna calculada persistente, efectivamente como un desencadenador). ¡Este también es un problema multiplataforma! Luego, si indicas el hash actual y tu hash, es una búsqueda relativamente fácil.

¿Al menos puede usar el campo de marca de tiempo para reducir el número de hashes que necesita comprobar?

Otra cosa para recordar es que no existe una función hash perfecta, por lo que es posible que tenga falsos negativos (la colisión hash inadvertida provoca que no se detecte un cambio). ¿Vale la pena tomar ese riesgo (astronómicamente pequeño)?

+0

La idea de usar las marcas de tiempo junto con el hash es buena, me gusta eso. Eso debería mantener el rendimiento mucho mejor. Creo que la probabilidad de encontrar una colisión hash es bastante baja. Podría usar SHA1 o algo así si descubro que MD5 no es suficiente. –

+0

No utilice un hash criptográfico unidireccional si no lo necesita. MD5 y SHA1 (aunque vulnerables) están diseñados como hashes criptográficos. Usar algo como CRC32 o CRC64 será MUCHO más eficiente. – scotru

+0

@scotru - CRC no se debe utilizar para el seguimiento de cambios. Estoy basando esto en este comentario: http://stackoverflow.com/a/7509974/1631910 – tomosius

0

Yo estandarizaría cómo su aplicación verifica la diferencia, no cómo la implementa la base de datos. Intente algo así como usar una vista con una columna particular que signifique un cambio. Luego use los trucos apropiados implementados en cada base de datos para hacer que esa vista sea una realidad. El código que depende de verificar esta diferencia sería el mismo, utilizando la misma vista y columna.

+0

La división de las columnas en dos tablas * no es * una opción. No puedo cambiar la otra aplicación de terceros para acomodar ese cambio de base de datos. –

+0

@Keith Palmer, solo vuelva a leer la pregunta –

Cuestiones relacionadas