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

Не убивайте себя преждевременной оптимизацией. Используйте простой подход: вставляйте каждую строку по одной. Если вы обнаружите, что у вас есть транзакционные проблемы, такие как блокировка таблицы слишком долгая во время цикла, вы можете сначала вставить строки во временную таблицу, а затем выполнить одну вставку в реальную целевую таблицу.
Если бы вы использовали SQL Server, вы могли бы выполнять массовую вставку или упаковывать данные в XML, но я все же настоятельно рекомендую сначала реализовать его простым способом, а затем протестировать его, и если вы можете протестировать с производственными данными (или тем же количеством data), а затем ищите оптимизацию только в случае необходимости.
Недавно я столкнулся с подобной проблемой. Наше очень простое решение заключалось в загрузке данных веб-службы в таблицу с той же структурой, что и таблица БД. В таблице БД хранятся хеш-значения наиболее важных столбцов, и та же хеш-функция применяется к соответствующим столбцам в таблице веб-службы.
Тогда логика "синхронизации" выглядит так:
Удалите из таблицы веб-сервиса все строки с хешами, которые существуют в таблице БД. Это повторяющиеся данные, которые не нуждаются в синхронизации.
DELETE FROM ws_table WHERE hash IN (SELECT hash from db_table);
Удалите из таблицы БД все строки с хешами, которых нет в таблице веб-сервиса.
DELETE FROM db_table WHERE hash NOT IN (SELECT hash FROM ws_table);
Все, что осталось в таблице веб-сервисов, - это новые данные, и теперь их нужно вставить в таблицу БД.
INSERT INTO db_table SELECT ... FROM ws_table;
Это довольно грубый подход, и если он выполняется транзакционно (даже только шаги 2 и 3), блокирует таблицу БД на время, но это очень просто.
Одним из усовершенствований может быть работа с измененными записями с использованием операторов UPDATE, но это значительно усложняет работу и может быть не быстрее, чем DELETE, за которым следует INSERT.
Другая возможная оптимизация - установка флага вместо удаления строк. Позже эти строки можно будет удалить. Однако любая логика, использующая таблицу БД, должна игнорировать строки с установленным флагом.
Какую технологию веб-сервисов вы используете? Ява? .СЕТЬ? что-то другое? В зависимости от технологии вы можете использовать ярлыки.