Как мы можем объединить две базы данных с одинаковыми схемами? - PullRequest
4 голосов
/ 11 января 2011

У нас есть два экземпляра приложения rails, каждый из которых обращается к своей собственной базе данных;мы находимся в процессе преобразования их в одно приложение с единой базой данных.Мы уже сделали его части, которые должны быть специфичными для конкретного домена, работать правильно;теперь нам просто нужно объединить базы данных.Мы собираемся скопировать данные из одного экземпляра в базу данных другого и исправить идентификаторы, чтобы они не перекрывались.Есть много таблиц с большим количеством внешних ключей.Каков хороший способ сделать это, чтобы внешние ключи все еще указывали на правильную строку в новой базе данных?

Если это неясно, я рад усложнить ситуацию с плохим ascii art.

Ответы [ 2 ]

3 голосов
/ 12 января 2011

Большинство реляционных баз данных позволяют аннотировать внешний ключ, который будет ограничен, чтобы отслеживать, когда изменяется первичный ключ в таблице, на которую указывают.Вы можете настроить внешний ключ на автоматическое обновление, когда это происходит с помощью ON UPDATE CASCADE.Сделайте это для всех внешних ключей в обеих базах данных, затем обновите все первичные ключи в обеих базах, и все внешние ключи будут автоматически преобразованы.

2 голосов
/ 12 января 2011

Как насчет обновления каждого столбца идентификатора (включая внешние ключи) на его первоначальное значение, умноженное на 10, затем добавьте 1 для первой базы данных и 2 для второй базы данных.

Таким образом, идентификатор 1 становится 11 на 1 дБ и 12 на 2 дБ. Поскольку первичный и внешний ключи претерпевают одно и то же изменение, вам не нужно беспокоиться о том, как связаны записи, вы просто делаетеобновления с той же формулой.

Таким образом, это будет что-то вроде

На БД 1:

UPDATE user SET id = id * 10 + 1;
UPDATE privilege SET id = id * 10 + 1, user_id = user_id * 10 + 1;

На БД 2:

UPDATE user SET id = id * 10 + 2;
UPDATE privilege SET id = id * 10 + 2, user_id = user_id * 10 + 2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...