Да, использование нескольких ключей для ссылки на уникальную запись называется составным ключом.Хорошая или плохая практика зависит от вашей схемы базы данных.
Пример сценария
Давайте представим, что у нас есть 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, когда у вас есть данные, которые кажутся одинаковыми (например, адрес).Вы должны всегда проявлять осторожность при соединении многих моделей вместе.Хороший индикатор того, что вы зашли слишком далеко, - это когда вы замечаете, что переключаетесь в зависимости от типа ассоциации.Потенциальное решение состоит в том, чтобы преобразовать общий код в модуль и смешать его с интересующими вас моделями.