Cómo saber si el registro ha cambiado en Postgres

Tengo un poco de un tipo de pregunta "sobresaliente" ... pero quiero lanzarla porque es un poco diferente a cualquiera que haya leído en stackoverflow.

Problema basico

Estoy trabajando para pasar de mysql a PostgreSQL 9.1.5 (alojado en Heroku). Como parte de eso, necesito importar múltiples archivos CSV todos los días. Algunos de los datos son información de ventas y casi se garantiza que sean nuevos y que deban insertarse. Pero, casi todas las partes de los datos tienen casi la misma garantía. Por ejemplo, los archivos csv (nota plural) tendrán información de POS (punto de venta) en ellos. Esto rara vez cambia (y es muy probable que solo a través de adiciones). Luego está la información del producto. Hay alrededor de 10,000 productos (la gran mayoría no se modificará, pero es posible tener tanto adiciones como actualizaciones).

El elemento final (pero es importante), es que tengo un requisito para poder proporcionar una pista / información de auditoría para cualquier elemento dado. Por ejemplo, si agrego un nuevo registro POS, debo poder rastrearlo hasta el archivo en el que se encontró. Si cambio un código UPC o la descripción de un producto, entonces necesito poder rastrearlo a la importación (y archivo) de donde vino el cambio.

Solución que estoy contemplando.

Dado que los datos se me proporcionan a través de CSV, estoy trabajando en torno a la idea de que COPY será la mejor / la más rápida. La estructura de los datos en los archivos no es exactamente lo que tengo en la base de datos (es decir, el destino final). Por lo tanto, los estoy copiando en tablas en el esquema de preparación que coinciden con el CSV (nota: un esquema por fuente de datos). Las tablas en los esquemas de preparación tendrán un antes de insertar activadores de fila. Estos disparadores pueden decidir qué hacer con los datos (insertar, actualizar o ignorar).

Para las tablas que tienen más probabilidades de contener nuevos datos, entonces intentará insertar primero. Si el registro ya está allí, devolverá NULL (y detendrá la inserción en la tabla de estadificación). Para las tablas que rara vez cambian, consultará la tabla y verá si se encuentra el registro. Si es así, entonces necesito una forma de ver si alguno de los campos ha sido cambiado. (porque recuerde, necesito mostrar que el registro se modificó al importar x del archivo y) Obviamente, solo puedo rellenar el código y probar cada columna. Pero, estaba buscando algo un poco más "elocuente" y más mantenible que eso.

En cierto modo, lo que estoy haciendo es combinar un sistema de importación con un sistema de seguimiento de auditoría. Entonces, en la investigación de pistas de auditoría, revisé lo siguientewiki.postgresql.org artículo. Parece que hstore podría ser una buena forma de obtener cambios (y poder ignorar fácilmente algunas columnas de la tabla que no son importantes, por ejemplo, "last_modified")

Estoy un 90% seguro de que todo funcionará ... He creado algunas tablas de prueba, etc. y he jugado con ellas.

¿Mi pregunta?

Es una forma mejor y más fácil de realizar esta tarea de encontrar los 3 registros de 10 K que requieren un cambio en la base de datos. Ciertamente, podría escribir un script de Python (o algo más) que lea el archivo e intente averiguar qué hacer con cada registro, pero eso se siente horriblemente ineficiente y dará lugar a muchos viajes de ida y vuelta.

Algunas cosas finales:

No tengo control sobre los archivos de entrada. Me encantaría que solo me enviaran los deltas, pero no lo hacen y está completamente fuera de mi control o influencia.El sistema está creciendo y es probable que se agreguen nuevas fuentes de datos que aumentarán considerablemente la cantidad de datos que se procesan (por lo tanto, estoy tratando de mantener las cosas eficientes)Sé que no es agradable, simple pregunta de SO (como "cómo ordenar una lista en python") pero creo que una de las mejores cosas de SO es que puedes hacer preguntas difíciles y la gente compartirá sus pensamientos sobre cómo piensan que es. La mejor manera de resolverlo es.

Respuestas a la pregunta(1)

Su respuesta a la pregunta