Добрый вечер.
Есть таблица в БД, в которую по расписанию загружаются данные из большого файла-дампа.
Каждый дамп атомарный - т.е., содержит все записи, которые надо вставить в данный момент, и все записи берутся только из этого одного дампа.
Для них нужно сохранять версионность каждой записи и следить за их изменениями: появлением новых, изменением и удалением старых.
Сейчас это реализовано так:
- Две таблицы: main и history с одинаковой структурой;
- В mainпервичный ключ - айди записи;
- В historyпервичный ключ - хеш от всех полей таблицы;
- Входные данные обрабатываются и чистятся;
- Вставляются по одной записи в таблицу main с on duplicate key update;
- После вставки строки берется mysql_affected_rows, если 1 - запись новая, если 2 - запись уже была, но изменилась;
- Считается хеш от данных, и эта же строка с хешем вставляется в history
В результате в
main лежат актуальные записи, в
history - история изменений каждой + актуальная запись.
Правильный ли это алгоритм?
Как в таком случае отследить удаление записи - когда она была в прошлом дампе, но исчезла в текущем?
Пока я вижу только такой подход: для каждой записи в
main добавить поле
datetime- дата изменения/загрузки дампа. После вставки всех записей делать второй проход - выборку всех записей, для которых это поле не обновилось - они будут считаться удалёнными из текущего дампа, и скрипт будет на это соответственно реагировать.