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?

War es hilfreich?

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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top