Когда нужно объединить дубли без потери истории, нельзя просто удалить лишние записи. За дублями могут быть заказы, оплаты, обращения, бонусы, документы и права доступа.

Безопасная дедупликация строится вокруг master-записи: какие данные остаются главными, какие связи переносим, что архивируем и как откатываем ошибку.

Коротко: что сделать

  • Определить критерии дублей
  • Выбрать master-запись для каждой группы
  • Собрать все связанные таблицы
  • Подготовить план переноса связей
  • Сделать аудит и возможность отката

Основные причины

У проблемы может быть несколько уровней: интерфейс, backend, права, внешняя интеграция, кэш, очередь задач или настройки сервера. Поэтому лучше не гадать, а пройти цепочку от действия пользователя до записи в логах и базе.

  • Клиенты создавались по разным телефонам и email
  • Интеграции заводили одни и те же объекты повторно
  • Нет уникальных ограничений на бизнес-ключи
  • Импорт из Excel создал новые записи вместо обновления
  • Менеджеры вручную создавали дубли в CRM

Пошаговая диагностика

Диагностику удобнее вести на одном воспроизводимом примере: один пользователь, один заказ, один запрос, один файл или одно событие. Так проще отделить реальную причину от случайных совпадений.

  • Найти группы дублей по телефону, email, ИНН или внешнему ID
  • Проверить связанные заказы, платежи, документы и комментарии
  • Сравнить заполненность полей в дублях
  • Проверить, какие системы используют ID записей
  • Сделать тестовую миграцию на копии базы

Как исправить проблему

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

  • Создать таблицу mapping old_id -> master_id
  • Перенести внешние связи на master-запись
  • Слить поля по понятным приоритетам
  • Архивировать дубли вместо физического удаления
  • Добавить уникальные ограничения и проверку при импорте

Безопасный план решения

Объединение дублей делайте через миграционный скрипт с dry-run, логом изменений и откатом. Ручные правки в базе быстро приводят к потерянным связям.

Чего не стоит делать

  • Не удалять дубли до переноса связей
  • Не объединять записи только по имени
  • Не терять историю заказов и оплат
  • Не запускать массовое слияние без копии базы

Что подготовить перед исправлением

  • Тип сущностей: клиенты, заказы, товары, организации
  • Критерии дублей
  • Список связанных таблиц
  • Копия базы
  • Примеры сложных дублей

FAQ

Что делать с конфликтующими полями?

Нужно заранее задать правила приоритета: свежая запись, подтвержденный телефон, заполненное поле, ручная проверка.

Можно ли объединять автоматически?

Да, для уверенных совпадений. Сомнительные группы лучше отдавать на ручную проверку.

Как не потерять историю?

Не удалять связи, а переносить их на master_id и сохранять журнал объединения.

Когда стоит обратиться за помощью

Помощь нужна, если дубли есть в CRM, заказах, платежах, бонусах или интеграциях с внешними системами.

Итог

Сделайте master-записи, mapping, перенос связей и аудит. Если нужно объединить дубли без потери истории, пишите в Telegram @rabotator_support.