Как мне синхронизировать результаты веб-сервиса с БД? - PullRequest
2 голосов
/ 18 ноября 2008

Я ищу способ быстро сравнить состояние таблицы базы данных с результатами вызова веб-службы.

Мне нужно убедиться, что все записи, возвращаемые вызовом веб-службы, существуют в базе данных, а все записи в базе данных, которых больше нет в ответе веб-службы, удаляются из таблицы.

Мне нужно решить проблемы:

  1. Как быстро сравнить данные структура с результатами таблица базы данных?
  2. Когда я найду Разница, как я могу быстро добавить что нового и убрать что пропало?

Что касается номера 1, я думал о создании MD5 структуры данных и ее сохранении в базе данных. Если MD5 отличается, то я бы перешел к шагу 2. Существуют ли более эффективные способы сравнения данных ответов с состоянием базы данных?

Мне нужно больше рекомендаций по поводу номера 2. Я могу легко извлечь все записи из таблицы (SELECT * FROM users WHERE user_id = 1), а затем перебрать массив, добавив то, чего нет в БД, и создав еще один массив элементов для удален в последующем звонке, но я надеюсь, что лучше (быстрее) это сделать. Каков наилучший способ сравнения и синхронизации структуры данных с подмножеством таблицы базы данных?

Спасибо за понимание этих вопросов!

Ответы [ 2 ]

1 голос
/ 15 марта 2009

Недавно я столкнулся с подобной проблемой. Наше - очень простое - решение состояло в том, чтобы загрузить данные веб-службы в таблицу с той же структурой, что и в таблице БД. В таблице БД хранится хеш самых важных столбцов, и эта же хеш-функция применяется к соответствующим столбцам таблицы веб-службы.

Тогда логика синхронизации выглядит так:

  1. Удалите все строки из таблицы веб-службы с хешами, которые существуют в таблице БД. Это повторяющиеся данные, которые не нуждаются в синхронизации.

    DELETE FROM ws_table WHERE hash IN (SELECT hash from db_table);

  2. Удалите все строки из таблицы БД с хешами, не найденными в таблице веб-службы.

    DELETE FROM db_table WHERE hash NOT IN (SELECT hash FROM ws_table);

  3. Все, что осталось в таблице веб-службы, - это новые данные, и теперь их следует вставить в таблицу БД.

    INSERT INTO db_table SELECT ... FROM ws_table;

Это довольно грубый подход, и если он выполняется транзакционно (даже просто на шагах 2 и 3), он блокирует таблицу БД на время, но это очень просто.

Одним из уточнений будет обработка измененных записей с использованием операторов UPDATE, но это добавляет значительную сложность и не может быть быстрее, чем DELETE, за которым следует INSERT.

Другая возможная оптимизация - установить флаг вместо удаления строк. Строки могут быть удалены позже. Однако любая логика, использующая таблицу БД, должна игнорировать строки с установленным флагом.

1 голос
/ 18 ноября 2008

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

Если бы вы использовали SQL Server, вы могли бы выполнять массовые вставки или упаковывать данные в XML, но я все равно настоятельно рекомендую сначала реализовать это простым способом, затем протестировать его, и если вы можете протестировать с производственными данными (или то же количество данных), а затем оптимизировать только в случае необходимости.

...