Когда нужно объединить дубли без потери истории, нельзя просто удалить лишние записи. За дублями могут быть заказы, оплаты, обращения, бонусы, документы и права доступа.
Безопасная дедупликация строится вокруг 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.