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

228
15 мая 2018, 01:50

Есть много баз данных с одинаковой структурой. Мне надо их слить в одну. Проблема в том что при сливе могут дублироваться id-шники (они же уникальные только в пределах одной базы) в одинаковых таблицах. И их нельзя просто заново сгенерировать insert-ом потому что на них есть ссылки из других таблиц... И таких ссылок много. Я уже замучился их мержить. Слить то не проблема union-ом, но вот с id-шниками очень сложно. Может для такой штуки уже придумано какое-то решение простое? Может я чего не знаю?

Answer 1

У нас подобное было. Правда мы использовали Oracle.

Так вот чтобы сохранить уникальность в разрезе БД-источника мы делали доп. поле - ID БД грубо говоря(SOURCEID). И primary делали составной(из поля ID и SOURCEID)

P.S: Также можно использовать "смещение", чтобы не добавлять отдельное поле.

К примеру ID = 1, SOURCEID = 1; будующий ID = 100001; И т.д.

Answer 2

В качестве возможного решения.

Анализируем схему, берём на "карандаш" все связи, выявляем "кусты" (когда одно и то же значение соответствует более чем в 2 полях) и группируем. Для каждой связи подбираем такое значение delta, прибавление которого к id снимает проблему потенциального дублирования (ну то есть delta > MAX(main_db.table.field)-MIN(add_db.table.field) по каждой таблице, после чего берётся максимальная delta для всего куста связей).

Затем делается выгрузка данных из таблиц дополнительной БД в plain text с корректировкой ID-ов (как уников, так и рефералов) запросом типа

SELECT id + @delta1, field1, field2, ..., ref_field + @delta2, ...
INTO OUTFILE 'backup_tableX_filename' export_parameters
FROM add_db.tableX;

А загрузка выполняется уже без корректировки

LOAD DATA INFILE 'backup_tableX_filename' import_parameters
INTO TABLE main_db.tableX;
Answer 3

Просто не будет никак. У вас при проектировании никто видимо не представлял, что понадобится этот сценарий с множественными копиями и их слиянием, иначе бы задумались о какой-никакой соломке, например guid в качестве ключей или сегментации id.

Переводите потихоньку все базы с int на guid - будет проще слить воедино. Этот вариант может оказаться более выигрышным в случае если объединение будет не единоразовым.

Также мне кажется исходя из комментариев, что вам скоро может понадобится инструмент merge записей. Я например, считаю подобные вещи вообще must have в информационных системах. Например, у меня объединить дубль клиентов в системе - дело нескольких кликов (больше всего времени уходит на указание какой клиент будет 'primary' (основным, куда вливаются данные), при этом корректно объединятся контакты (тоже с дубликатами!), заказы и т.п.

В этом плане возможно вам покажется интересными статьи на хабре про dadata.ru - парни пишут толковые технические вещи про дедупликацию бизнес-данных. Ну вот например, нашлось сходу в поиске: DaData.ru находит и уничтожает одинаковых людей

Тут видите в чём фишка. Перестаньте думать о вашей задаче, как о "только SQL-запросами обойтись", не факт что получится.

READ ALSO
Android и MySQL соединение

Android и MySQL соединение

пишу мобильное приложение, которое должно получать данные из СУБД MySQL

176
Запрос MySQL на выборку записей по столетию

Запрос MySQL на выборку записей по столетию

Есть таблица, содержащая информацию про космические объекты, в частности, их тип (например, звезда, планета и тд

181
Ошибка Insert MySQL

Ошибка Insert MySQL

хочу добавить запись:

185
Generics in java learning [требует правки]

Generics in java learning [требует правки]

What are generics I am a beginner for programming I have zero about generics please explain me with examples

155