Allgemeine Frage zu Foreign-Keys
Mark
- datenbank
Hallo zusammen,
ich habe bisher immer ohne Foreign Keys gearbeitet - aber ich hatte auch schon Probleme mit "herrenlosen" Datensätzen ;-) Daher hab ich da mal Nachholbedarf gesehen.
Jetzt hab ich mich in das Thema eingelesen, und wollte nur nochmal von euch bestätigt bekommen, ob ich den Sinn wirklich verstanden habe: Foreign Keys sichern die referentielle Integrität. Korrekt eingesetzt verhindern sie Datenmüll, der zurückbleiben kann, wenn man beispielsweise aus einer Tabelle einen Datensatz löscht, ohne in diversen Untertabelle damit verbundene Datensätze ebenfalls zu löschen. Dank "on update" Funktion können die Datensätze in Untertabellen automatisch gelöscht oder geändert werden.
Sie verhindern auch das Einfügen von Datensätzen in Untertabellen, wenn in der übergeordneten Tabelle keine Referenz dazu vorhanden ist.
ABER: Sie bringen bei Abfragen keinen Geschwindigkeitsunterschied. Vielleicht geht das Löschen von Datensätzen etwas schneller, weil automatisch untergeordnete Daten mit gelöscht werden und man keine 2, 3 oder 4 DELETE-Statements dafür braucht. Aber generell sind die Abfragen, zb JOINs zwischen zwei durch Foreign-Keys verbundene Tabellen nicht schneller als würde man das gleiche bei "nicht verbundenen" Tabellen tun.
Stimmt das? Wäre sehr dankbar für ein kurzes Feedback :)
Beste Grüße
Mark
Hi,
Jetzt hab ich mich in das Thema eingelesen, und wollte nur nochmal von euch bestätigt bekommen, ob ich den Sinn wirklich verstanden habe:
hast Du. Die eventuell vorhandenen Geschwindigkeitsvorteile liegen eigentlich auch nur darin begründet, dass ein Foreign Key in der Zieltabelle immer einen Unique Index als Gegenüber hat, und so ein Ding macht gewisse Dinge recht flott.
Cheatah
Hi!
[..] und so ein Ding macht gewisse Dinge recht flott.
Dinge, welche andere Dinge beflügeln sind doch zumindest bedingt gute Dinge, oder sollte man sich derer bedingungslos bedingen, um Dinger zu bekommen?
off:P'ratlos'P
Hi,
Dinge, welche andere Dinge beflügeln sind doch zumindest bedingt gute Dinge, oder sollte man sich derer bedingungslos bedingen, um Dinger zu bekommen?
"Aber unbedingt!" ... sprach der Dingo.
Dingens, äh, Cheatah
moin,
Sie verhindern auch das Einfügen von Datensätzen in Untertabellen, wenn in der übergeordneten Tabelle keine Referenz dazu vorhanden ist.
nicht ganz, der fremdschlüssel kann durch aus den "wert" NULL einnehmen, somit ist kein entsprechender gegenpart in der übergeordneten tabelle vorhanden, aber die referentielle integrität ist trotzdem nicht verletzt. wenn du auch das auschließen willst, musst du der entsprechenden spalte auch noch die eigenschaft NOT NULL geben.
Vielleicht geht das Löschen von Datensätzen etwas schneller, weil automatisch untergeordnete Daten mit gelöscht werden und man keine 2, 3 oder 4 DELETE-Statements dafür braucht.
nicht wirklich, mit referentieller integrität gehen DML operationen grundsätzlich langsamer, da das dbms zusätzlich noch überprüfungen eben bezüglich der referentiellen integrität ausführt.
Ilja