2010-06-01 7 views
26

Ist es besser, Fremdschlüssel in Tabellen zu verwenden oder können die gleichen Ergebnisse mit Joins erzielt werden?Foreign Keys vs Joins

+3

Was ist der Unterschied? Joins werden nur mit Fremdschlüsseln definiert. Natürlich können Sie den Fremdschlüssel in der Datenbank nicht definieren. Wenn Sie einen Fremdschlüssel verwenden, wird die Leistung verbessert (sofern die Auswahl des Fremdschlüssels richtig ist). – Kangkan

+2

'Joins werden nur mit Fremdschlüsseln definiert' False! 'Die Verwendung eines Fremdschlüssels verbessert die Leistung. In der Tat kann FK, wenn überhaupt, die Leistung beeinträchtigen, wenn auch nur selten bis zu einem merklichen Grad, der das Entfernen dann rechtfertigt. – Brandon

+1

@Kangkan Erstellen von FK haben nichts mit Leistung FK! = Indizes. Es gibt DBMS automatische erstellt einen Index in der FK-Erstellung, aber die meisten nicht. Joins brauchen keinen FK, bitte beziehen Sie sich auf eine ausgezeichnete Antwort von Daniel. Vielleicht OP ist verwirrt von ORM-Frameworks – jean

Antwort

53

Foreign keys sind nur Einschränkungen zum Erzwingen referential integrity. Sie müssen weiterhin JOINs verwenden, um Ihre Abfragen zu erstellen.

Fremdschlüssel garantieren, dass eine Zeile in einer Tabelle order_details mit einem Feld order_id eine orders Tabelle verweist nie einen order_id Wert hat, der in der orders Tabelle existiert nicht. Fremdschlüssel müssen keine funktionierende relationale Datenbank haben (tatsächlich unterstützt MySQL's default storage engine keine FKs), aber sie sind unbedingt erforderlich, um zerbrochene Beziehungen und verwaiste Zeilen (dh referentielle Integrität) zu vermeiden.

+1

Ich möchte nur darauf hinweisen, dass, obwohl FK cool sind, ist es eher schlechtes Design auf die DB für die Anwendungslogik * verlassen *. Ihre Anwendung kann ohne Aktualisierungen Ihrer Datenbank ausbrechen (durch Installationen multiplizieren). Möge es auch minimieren. –

+6

@sims: Ich betrachte "referentielle Integrität" nicht als Anwendungslogik. Die Fähigkeit, die referenzielle Integrität auf Datenbankebene durchzusetzen, ist Voraussetzung dafür, dass das C in [ACID] ​​(http://en.wikipedia.org/wiki/ACID) steht. –

+0

@sims: Ich stimme Daniel zu, möchte aber seine Argumentation erweitern. IMO RI ist ein Teil der Geschäftslogik (oder "Datenlogik") es muss irgendwo durchgesetzt werden (einmal, wiederhole dich nicht). Da die Datenbank die zentrale/endgültige Datenautorität ist, müssen die Daten dort gültig sein, daher ist sein Punkt, der ACID aufruft, korrekt! – lexu

22

FOREIGN KEY s und JOIN s das gleiche tun, nicht tun!

  • A FOREIGN KEY erzwingt Datenintegrität sicherstellen, dass die Daten an einige Regeln bestätigt, wenn es um die DB hinzugefügt wird.
  • A JOIN wird verwendet, wenn Sie Daten aus der Datenbank extrahieren/abfragen, indem Sie Regeln zum Auswählen der Daten angeben.

  • JOIN s funktionieren, wenn FK vorhanden ist oder nicht.

  • FK funktioniert, wenn Sie Daten mit oder ohne JOIN s extrahieren.

FAZIT: FK und JOIN erlauben Ihnen nicht das gleiche Ziel zu erreichen!