Это хорошая идея использовать внешний ключ для ссылки на 2 или более таблиц? - PullRequest
0 голосов
/ 09 августа 2010

Ruby on Rails ORM (реляционное сопоставление объектов) имеет полиморфные ассоциации вызова вещей, которые позволяют использовать внешний ключ для ссылки на 2 или более других таблиц.Это достигается путем создания дополнительного столбца с именем «type», в котором указывается таблица, с которой связан внешний ключ.

Есть ли у этой реализации имя с точки зрения базы данных?и это хорошая / плохая практика?

спасибо

Ответы [ 2 ]

1 голос
/ 09 августа 2010

Не все базы данных допускают составной внешний ключ, и лично я бы застрелил любого, кто пытался сделать это в моей базе данных.Внешние ключи ДОЛЖНЫ поддерживаться базой данных, а не чем-то вроде Rails.Существуют и другие процессы, которые обычно обращаются к базе данных, где необходимо проверить эти критические отношения, которые могут не использовать ORM (я, конечно, не использовал бы такую ​​вещь, чтобы импортировать 10 000 000 записей или обновить миллион записей о ценах или исправить данныепроблема целостности.

1 голос
/ 09 августа 2010

Да, использование нескольких ключей для ссылки на уникальную запись называется составным ключом.Хорошая или плохая практика зависит от вашей схемы базы данных.

Пример сценария

Давайте представим, что у нас есть 4 таблицы: A, B, C и Z.Z поддерживает ссылку на A, B и C.Каждая запись содержит ссылку на одну таблицу.Ниже приведены две потенциальные схемы для Z.

Один внешний ключ

Нам нужен столбец для хранения ссылки для каждой из таблиц.Это означает, что мы получим значения NULL для неиспользуемых столбцов.В будущем, если мы введем таблицу D, нам потребуется добавить новый столбец в Z.

id | a_id | b_id | c_id
-----------------------
1  | 1    | NULL | NULL
2  | NULL | 1    | NULL
3  | NULL | NULL | 1

Составной внешний ключ

Мы начнем с двух столбцов для построения ссылки на другие таблицы.Однако когда мы вводим D, нам не нужно изменять схему.Кроме того, у нас никогда не будет столбцов со значениями NULL.

id | z_id | z_type
------------------
1  | 1    | 'A'
2  | 1    | 'B'
3  | 1    | 'C'

Следовательно, мы можем достичь некоторого уровня нормализации, используя составные внешние ключи.При условии, что оба столбца проиндексированы, запросы должны быть очень быстрыми.Хотя он должен быть медленнее, чем использование одного внешнего ключа, разница незначительна.

Часто бывает заманчивым использовать полиморфные ассоциации Rails, когда у вас есть данные, которые кажутся одинаковыми (например, адрес).Вы должны всегда проявлять осторожность при соединении многих моделей вместе.Хороший индикатор того, что вы зашли слишком далеко, - это когда вы замечаете, что переключаетесь в зависимости от типа ассоциации.Потенциальное решение состоит в том, чтобы преобразовать общий код в модуль и смешать его с интересующими вас моделями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...