Как узнать, изменилась ли запись в Postgres

У меня есть немного "upsert" Тип вопроса ... но я хочу добавить его, потому что он немного отличается от того, который я читал в stackoverflow.

Основная проблема.

Я работаю над переходом с MySQL на PostgreSQL 9.1.5 (размещен на Heroku). Как часть этого, мне нужно импортировать несколько файлов CSV каждый день. Некоторые данные являются информацией о продажах и почти гарантированно являются новыми и должны быть вставлены. Но другие части данных почти гарантированно будут такими же. Например, файлы CSV (примечание во множественном числе) будут содержать информацию о точках продаж (POS). Это редко меняется (и, скорее всего, только через дополнения). Тогда есть информация о продукте. Существует около 10 000 продуктов (подавляющее большинство из них не изменится, но возможно иметь как дополнения, так и обновления).

Последний пункт (но важный) заключается в том, что у меня есть требование предоставить контрольный журнал / информацию для любого данного элемента. Например, если я добавляю новую запись POS, мне нужно иметь возможность отследить ее обратно в файле, в котором она была найдена. Если я изменю код UPC или описание продукта, то мне нужно будет отследить его в импорт (и файл), откуда пришли изменения.

Решение, которое я обдумываю.

Поскольку данные предоставляются мне через CSV, я работаю над идеей, что COPY будет лучшим / быстрым способом. Структура данных в файлах не совсем то, что у меня есть в базе данных (то есть конечный пункт назначения). Итак, я копирую их в таблицы в промежуточной схеме, которые соответствуют CSV (примечание: одна схема на источник данных). Таблицы в промежуточных схемах будут иметь триггеры строки перед вставкой. Эти триггеры могут решить, что делать с данными (вставить, обновить или игнорировать).

Для таблиц, которые, скорее всего, содержат новые данные, он попытается вставить в первую очередь. Если запись уже существует, она вернет NULL (и остановит вставку в промежуточную таблицу). Для таблиц, которые редко меняются, он запросит таблицу и посмотрит, найдена ли запись. Если это так, то мне нужен способ увидеть, если какие-либо поля изменены. (потому что помните, мне нужно показать, что запись была изменена при импорте x из файла y) Очевидно, я могу просто набросать код и протестировать каждый столбец. Но искал что-то более «красноречивое» и более ремонтопригодны, чем это.

В некотором смысле, то, что я делаю, - это объединение системы импорта с системой контрольного журнала. Итак, при изучении журналов аудита я рассмотрел следующееwiki.postgresql.org статья. Кажется, что hstore может быть хорошим способом получения изменений (и возможностью легко игнорировать некоторые столбцы в таблице, которые не важны - например, «last_modified»)

Я примерно на 90% уверен, что все это будет работать ... Я создал несколько таблиц тестирования и т. Д. И поиграл с ними.

Мой вопрос?

Это лучший, более понятный способ решения этой задачи - найти, возможно, 3 записи из 10 КБ, требующих изменения в базе данных. Я, конечно, мог бы написать скрипт на python (или что-то еще), который читает файл и пытается выяснить, что делать с каждой записью, но это кажется ужасно неэффективным и приведет к множеству циклов.

Несколько последних вещей:

I don't have control over the input files. I would love it if they only sent me the deltas, but they don't and it's completely outside of my control or influence. he system is grow and new data sources are likely to be added that will greatly increase the amount of data being processed (so, I'm trying to keep things efficient) I know this is not nice, simple SO question (like "how to sort a list in python") but I believe one of the great things about SO is that you can ask hard questions and people will share their thoughts about how they think the best way to solve it is.

Ответы на вопрос(1)

Ваш ответ на вопрос