Есть ли какие-то причины, по которым вы можете не захотеть иметь иностранный ключ в ассоциации? - PullRequest
2 голосов
/ 28 мая 2009

Если у вас есть

Parent
 has_many :children

Child

Есть ли какая-либо причина, по которой внешний ключ на Child (родительский) и соответствующий belongs_to :parent могут быть нежелательны?

Когда, если вообще, вы не хотите, чтобы ваш ребенок имел доступ к своим родителям?

Ответы [ 2 ]

4 голосов
/ 28 мая 2009

Это компромисс. Обычный аргумент против внешних ключей заключается в том, что индекс для внешнего ключа несет некоторые издержки производительности при вставке / обновлении / удалении. Как и любой индекс.

Но индекс также дает большую выгоду при поиске по этому столбцу.

SELECT * FROM Child WHERE parent_id = :id 

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

-- Typical chore: searching for orphaned child rows.

SELECT c.* FROM Child c LEFT OUTER JOIN Parent p 
  ON (c.parent_id = p.parent_id) 
WHERE p.parent_id IS NULL;

Существуют также некоторые конструкции баз данных, в которых вы не можете использовать внешние ключи, такие как полиморфные ассоциации или Entity-Attribute-Value. Но эти проекты сами по себе являются анти-шаблонами.

1 голос
/ 28 мая 2009

Производительность. При добавлении дочерней записи необходимо определить, есть ли родительская запись. Вы по-прежнему можете обращаться к родительской записи (при условии, что у вас есть столбец parentID в дочерней таблице, но нет ссылочной целостности).

...