Как сохранить ограничение внешнего ключа в разных базах данных?

Я знаю, я знаю, что размещение двух связанных таблиц в разных базах данных - не самая лучшая практика проектирования. Но ради чего бы то ни было, предположим, что я должен сделать это абсолютно. И мне нужно разбить две таблицы, связанные с внешним ключом, которые ранее находились в базе данных, на две базы данных, которые расположены на двух разных серверах, но я все еще хочу поддерживать базы данных честность. Как лучше всего это сделать?

Изменить: я использую MySQL и Symfony


person Graviton    schedule 23.03.2009    source источник
comment
Я думаю, вам нужно сообщить нам, какую базу данных вы используете, ответ (кроме JUST DON'T), вероятно, будет очень зависеть от вашего стека.   -  person Benjol    schedule 23.03.2009
comment
Находятся ли эти таблицы в двух разных экземплярах mysql или в двух разных каталогах внутри одного экземпляра mysql?   -  person Petros    schedule 23.03.2009
comment
Хм, на самом деле таблицы находятся в разных базах данных, и эти две базы данных расположены на разных серверах.   -  person Graviton    schedule 23.03.2009


Ответы (2)


Я не могу придумать, как это сделать со стандартным MySQL.

Вы можете написать плагин для MySQL Proxy, который управляет ссылочной целостностью между родительской и дочерней таблицами на разных серверах. :

  • Перехватить INSERT и UPDATE дочернюю таблицу. Запрос на соответствие строки в родительской таблице. Ошибка _3 _ / _ 4_, если в родительской таблице не найдено совпадений.

  • Перехватить DELETE с родительской таблицей. Запрос зависимых строк в дочерней таблице. Ошибка DELETE, если в дочерней таблице найдены какие-либо зависимые строки. Если ограничение предназначено для поддержки каскадного поведения, сделайте это вместо сбоя.

  • Перехватить UPDATE против родительской таблицы. Если значение первичного ключа изменяется как часть обновления, запросите зависимые строки, найденные в дочерней таблице. Ошибка UPDATE, если в дочерней таблице найдены какие-либо зависимые строки. Если ограничение предназначено для поддержки каскадного поведения, сделайте это вместо сбоя.

Обратите внимание, что вам нужно будет хранить информацию об ограничениях ссылочной целостности в вашем плагине MySQL Proxy (или написать собственный файл конфигурации для вашего плагина, который записывает отношения). Вы не можете использовать обычный синтаксис FOREIGN KEY для объявления таких ограничений в экземплярах MySQL.

person Bill Karwin    schedule 23.03.2009

Рассматривали ли вы объединенные таблицы? По сути, это ссылки на таблицы, которые размещены в разных базах данных на другом / том же хосте.

Вы можете создать объединенную таблицу локально и использовать ее для обеспечения ссылочной целостности. Однако я не могу переоценить тот факт, что такой подход чреват ошибками в будущем и совсем не рекомендуется.

person Learning    schedule 23.03.2009
comment
Внешние ключи вообще не поддерживаются для таблиц FEDERATED. На конференции MySQL в апреле будет рассказано о возможности будущей поддержки FK в распределенных таблицах в MySQL 6.1! - person Bill Karwin; 24.03.2009