Как вычислить дубликаты при обновлении базы данных через API?

Добрый день,

Мой проект обновляет базу данных на стороннем сервере через API. Несколько таблиц, по несколько миллионов данных каждая. У каждой записи есть уникальный идентификатор.

К сожалению API не очень умный и поддерживает только добавление новых записей и полную перезапись таблицы.

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

Вопрос: Какой наилучший способ избежать дублирования информации?

В качестве варианта: Держать копию БД у себя на сервере и с ее помощью вычислять дубликаты.

Но хочется чего-то более изящного.

Спасибо.
  • Вопрос задан
  • 3694 просмотра
Пригласить эксперта
Ответы на вопрос 5
vsespb
@vsespb
Конкретный совет не могу дать. Ничего кроме копии БД не лезет в голову. Хорошая ли это практика или нет, сказать не могу. Может и хорошая. Нужно знать все подробности API — кто, зачем, куда итд.

Могу только посоветовать попросить провайдера API пофиксить своё API или прояснить, может Вы его не по назначению используете. Или пусть даст совет.
Ответ написан
ertaquo
@ertaquo
Попробуйте считать хеш каждой записи и сохранять его в отдельном индексированном поле. Хотя если база уже большая, то ее обновление займет довольно много времени.
Ответ написан
tolyjan
@tolyjan
Удаляйте дублирующие записи, подобным запросом
DELETE u1 FROM users u1, users u2 WHERE u1.id > u2.id AND u1.name = u2.name;
условие WHERE можно редактировать под свои нужды, если дублируется поле name, то условие должно быть соответствующим u1.name = u2.name
Это вполне изящный и действенный способ.
Ответ написан
@AlexeyVD
По-хорошему, если данные в таблицах на сервере не должны дублироваться, то логично было бы создать там уникальные ключи по нужным полям, и тогда никакие дубликаты бы уже туда не попадали.
Соответственно, если нужно избежать ошибок при вставке дублирующихся данных, то нужно поправить API и использовать там INSERT IGNORE либо INSERT… ON DUPLICATE KEY UPDATE… в зависимости от того, что вам нужно.
Ответ написан
EugeneOZ
@EugeneOZ
Можно хранить у себя в key-value хранилище список ID, которые вы добавляли в виде 'key:hash', где hash это hash данных новой записи, а key — постоянный префикс. Сделать expire им на неделю, чтобы удалялись сами (или на другое время) и перед добавлением смотреть, существует ли ключ с именем «key:hash». Если не существует — добавлять. Это не 100% защита от дублей, но очень большой процент сможете отсеять, думаю.
100% защита была бы возможна, если бы можно было сущности добавить поле hash и перед добавлением спросить у API, есть ли запись, у которой поле hash равно hash данных. Тогда можно было бы сначала проверять в своём key-value (как я вышел описал) и, если отсутствует, проверять в API (чтобы не делать лишних запросов).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы