Ist es besser, Fremdschlüssel in Tabellen zu verwenden oder können die gleichen Ergebnisse mit Joins erzielt werden?Foreign Keys vs Joins
Antwort
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.
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. –
@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. –
@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
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!
- 1. Table-agnostic Foreign Keys?
- 2. Inheritance + Foreign Keys
- 3. Linq zu SQL Foreign Keys & Collections
- 4. Entity Framework-Datenbank First - Composite Foreign Keys
- 5. ASP.Net Entity Framework und Foreign Keys
- 6. MySQL-Viele-zu-Viele-Beziehung mit FOREIGN KEYS
- 7. SQL :: Viele zu viele Tabellen oder nur Foreign Keys
- 8. Generieren Sie alle möglichen Kombinationen aus 2 Foreign Keys
- 9. verschachtelte Abfrage vs Joins
- 10. Joins auf Ints vs Joins auf Chars (oder Varchars)
- 11. MySQL Architektur: Null Spalten vs Joins
- 12. SQL Joins Vs SQL-Unterabfragen (Leistung)?
- 13. Joins vs andere Methoden in mySQL
- 14. mehrere Joins vs zwischengespeicherte einzelne Abfragen?
- 15. Foreign Keys Referenzierung der gleichen Tabelle Ausnahme beim Upgrade von EF Core RC2 auf V1
- 16. Foreign Keys und Multi Model-Formulare in Rails 2.3 - Bug oder Feature?
- 17. Kosten von std :: map mit std :: string keys vs int keys?
- 18. Erweiterte (?) SQL Joins?
- 19. SQLite Foreign Key
- 20. erstellen Foreign Key SQL
- 21. Foreign Key Fehlerwert fehlt
- 22. Django - mit Foreign Abfrage
- 23. Foreign Key Constraint Syntax
- 24. Return Foreign in SubSonic.Query
- 25. Composite Foreign Key Frage
- 26. Django - Foreign Key Standard
- 27. Foreign Key Constraint Problem
- 28. mySQL SCHAFFEN FOREIGN KEY
- 29. Joins in Laravel
- 30. Fremdschlüssel vs Partitionierung
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
'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
@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