У меня есть две таблицы базы данных, одна на MYSQL и одна на MSSQL. Оба имеют схожие данные, и один основан на данных другого. Они находятся в двух разных базах данных, потому что одна - это администрируемая удаленная система, а локальная система - это установка Drupal, которую я использую для более удобного отображения данных через пользовательский модуль.
Например, у меня есть таблица такого рода структуры в MSSQL:
ID | Title | Description | Other fields I don't care about
И на основе извлечения данных из этой таблицы я создаю таблицу на MYSQL:
local_id | remote_id | title | description
Когда модуль инициализируется, он выходит из системы и делает выбор из таблицы MSSQL, генерирует записи и заполняет локальную базу данных. Remote_id - это поле идентификатора в базе данных MSSQL, поэтому мы можем ссылаться на две записи вместе.
Мне нужно синхронизировать эти данные, локально удаляя записи, которых больше нет в удаленной таблице, и создавая новые записи, которые не существуют локально, а также обновляя информацию обо всех строках.
Проблема в том, что для такого рода требуются как минимум две разные транзакции с возможными побочными транзакциями. Пример:
Чтобы синхронизировать локальное с удаленным и удалить несуществующие удаленные записи:
Select remote_id from local_table;
For Each remote_id ( select ID, title, description FROM remote_table where ID = remote_id )
If record exists
UPDATE local_table WHERE remote_id = row_id
Else
DELETE FROM local_table where remote_id = row_id
Затем нам понадобится как минимум еще одна транзакция для получения новых записей (я мог бы обновить и здесь, если бы не делал это в предыдущем цикле):
Select ID, title, description from remote_table;
For each ID ( Select remote_id from local_table )
If does not exist
INSERT INTO local_table (VALUES)
Так что это большая активность в БД. Было бы проще, если бы таблицы были одного типа, но так как это единственный способ, которым я знаю, как это сделать. Есть ли способ лучше? Могу ли я просто объединить оба набора результатов в ассоциативный массив и сравнить таким образом, и выполнять только транзакции, необходимые для удаления и создания? Я не уверен.