Gibt es irgendwelche Gründe, warum Sie keinen foreign_key in einem Verein haben möchten?
-
06-09-2019 - |
Frage
Wenn Sie
Parent
has_many :children
Child
Gibt es einen Grund ein Fremdschlüssel auf Child (Übergeordnetes) und eine entsprechende belongs_to :parent
möglicherweise nicht wünschenswert sein?
Wenn, wenn überhaupt, würden Sie nicht wollen Ihr Kind der Lage sein, seine Eltern zugreifen?
Lösung
Es ist ein Kompromiss. Das übliche Argument gegen Fremdschlüssel ist, dass der Index für einen Fremdschlüssel auf insert / update einig Performance-Overhead entstehen / löschen. Wie bei jedem Index.
Aber ein Index gibt auch großen Vorteil, wenn Sie über diese Spalte zu 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 einig Datenbank-Design, in dem Sie kann nicht verwenden Fremdschlüssel wie Polymorphe Verbände oder Entity-Attribut-Wert. Aber diese Entwürfe sind anti-Muster in ihrem eigenen Recht.
Andere Tipps
Performance. Es ist eine kostengünstige, wenn ein Kind Datensatz einfügen, wenn zu bestimmen, gibt es eine übergeordnete Datensatz ist. Sie können immer noch den übergeordneten Datensatz zugreifen (vorausgesetzt, Sie eine parentID Spalte in der untergeordneten Tabelle haben, nur keine referentielle Integrität).