2011-01-11 3 views
4

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

Если это неясно, я с удовольствием усложняю проблемы с плохим искусством ascii.

+3

+1 Только для предложения плохого искусства ASCII. :) –

+0

-1 для не только предоставления плохого искусства ASCII;) – TimoSolo

ответ

2

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

В этом случае id 1 становится 11 на db 1 и 12 на db 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; 
+0

Мы думаем о чем-то в этих строках - возможно, 2, а не о 10, но как мы можем идентифицировать столбцы, которые нам нужно изменить? – Simon

3

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