Es ist ein Kompromiss. Das übliche Argument gegen Fremdschlüssel ist, dass der Index für einen Fremdschlüssel beim Einfügen/Aktualisieren/Löschen einen gewissen Leistungsaufwand verursacht. Genau wie jeder Index.
Aber ein Index bietet auch einen großen Vorteil, wenn Sie über diese Spalte suchen.
SELECT * FROM Child WHERE parent_id = :id
auch nicht unterschätzen den Aufwand für Waisenkinder des Suchens und bollixed Referenzen Reinigung, die die unvermeidliche Folge des Weglassens Fremdschlüssel-Constraints sind.
-- 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;
Es gibt auch einige Datenbankentwürfe, in denen Sie können keine Fremdschlüssel verwenden, wie Polymorphe Verbände oder Entity-Attribut-Wert. Aber diese Designs sind selbst Anti-Patterns.