Как мне синхронизировать результаты веб-службы с БД?

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

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

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

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

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

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

Благодарим за понимание этих проблем!

Какую технологию веб-сервисов вы используете? Ява? .СЕТЬ? что-то другое? В зависимости от технологии вы можете использовать ярлыки.

BuddyJoe 18.11.2008 04:25

Для этого проекта PHP / MySQL. Результаты возвращаются в формате JSON или через библиотеку, которая предоставляет массивы PHP.

Bret Walker 18.11.2008 04:30
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
2
2
1 645
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Ответ принят как подходящий

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

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

  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.

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

Другие вопросы по теме