Это компромисс. Обычный аргумент против внешних ключей заключается в том, что индекс для внешнего ключа несет некоторые издержки производительности при вставке / обновлении / удалении. Как и любой индекс.
Но индекс также дает большую выгоду при поиске по этому столбцу.
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. Но эти проекты сами по себе являются анти-шаблонами.