Czy lepiej jest używać kluczy obcych w tabelach, czy te same wyniki można osiągnąć przy łączeniach?Klucze zagraniczne kontra połączenia
Odpowiedz
Foreign keys to tylko ograniczenia, aby wymusić referential integrity. Będziesz nadal potrzebował używać JOINs do budowania zapytań.
klucze obce zagwarantować, że rząd w tabeli order_details
z polem order_id
odwołującego tabelę orders
nigdy nie będzie mieć wartość order_id
który nie istnieje w tabeli orders
. Klucze obce nie muszą mieć działającej relacyjnej bazy danych (w rzeczywistości silnik MySQL's default storage nie obsługuje FK), ale są one zdecydowanie niezbędne, aby uniknąć zerwanych relacji i osieroconych wierszy (tj. Integralności referencyjnej).
Chcę tylko zwrócić uwagę, że chociaż FK są fajne, to raczej kiepski projekt polega na * poleganiu * na DB dla logiki aplikacji. Twoja aplikacja może się zepsuć bez aktualizacji bazy danych (mnożenie przez instalacje). Niech to też zminimalizuje. –
@sims: Nie uważam "spójności referencyjnej" za logikę aplikacji. Zdolność do egzekwowania więzów integralności na poziomie bazy danych jest wymagana, aby C w [ACID] (http://en.wikipedia.org/wiki/ACID) pozostało. –
@sims: Zgadzam się z Danielem, ale chciałbym przedłużyć jego rozumowanie. IMO RI jest częścią logiki biznesowej (lub "logiki danych"), którą musi być gdzieś egzekwowana (RAZ, nie powtarzaj się). Ponieważ DB jest centralnym/ostatecznym źródłem danych, dane muszą być tam ważne, dlatego jego punkt wywołujący ACID jest poprawny! – lexu
FOREIGN KEY
s i JOIN
s nie to samo!
FOREIGN KEY
wymusza integralność danych, upewniając się, że dane potwierdzają pewnych zasad, gdy jest on dodany do DB.A
JOIN
jest używany podczas wyodrębniania/zapytania danych z DB, podając zasady wyboru danych.JOIN
s pracy, jeśli istnieje FK lub nie.- Praca FK, jeśli wyodrębnisz dane z lub bez
JOIN
s.
WNIOSEK: FK i JOIN
nie pozwalają, aby osiągnąć ten sam cel!
- 1. Dziedziczenie + zagraniczne klucze
- 2. Klucze zagraniczne z aktywnąRecord :: Migration Rails?
- 3. Zagraniczne klucze z SchemaExport w płynnym NHibernate za pomocą SQLite
- 4. php sql łączący klucze podstawowe i zagraniczne (powiązane listy)
- 5. Autogenerowany domyślny ciąg połączenia kontra ręcznie dodany
- 6. "Serwer" kontra "Źródło danych" w ciągu połączenia
- 7. Dlaczego GitHub wywołuje zgłoszenia zagraniczne, "Żądanie pobrania"?
- 8. Django Inline Model Filtr administracyjny Pole zagraniczne
- 9. Wielokrotne klucze obce SQL jako klucze główne
- 10. Angular.js kontra Knockout.js kontra Backbone.js
- 11. java.net.SocketTimeoutException kontra java.net.ConnectException
- 12. CABasicAnimation klucze
- 13. Gniazda kontra HttpListener
- 14. Jak zdobyć zagraniczne repozytorium w moim repozytorium w Doctrine2/Symfony2?
- 15. Dwa klucze obce odnoszące się do tego samego klucza podstawowego
- 16. VirtualBox - Klon kontra Snapshot kontra Kopia zapasowa
- 17. Porównanie repozytorium kontra dostawca kontra usługa
- 18. Pojemniki na klucze, wystarczająco bezpieczne, aby przechowywać klucze prywatne?
- 19. Jak skryptować indeksy, klucze, klucze obce w SQL Server
- 20. Aplikacja GitHub Mac dodaje klucze SSH?
- 21. Klucze php elegancja wyłączające
- 22. klucze PHP tablicy wartości
- 23. Laravel + zerowe klucze obce
- 24. Klucze certyfikatów - konwersja
- 25. dynamiczne klucze tablicy
- 26. array_shift ale zachowujące klucze
- 27. Jak działają klucze obce?
- 28. Enum jak Dictionary klucze
- 29. Zdobądź klucze HashMap Java
- 30. Groovy odwróć klucze mapy
Jaka jest różnica? Połączenia są definiowane tylko za pomocą kluczy obcych. Oczywiście nie można zdefiniować klucza obcego w bazie danych. Używanie klucza obcego poprawi wydajność (pod warunkiem, że wybór klucza obcego jest właściwy). – Kangkan
'Połączenia są definiowane tylko za pomocą kluczy obcych' Fałsz! 'Używanie klucza obcego poprawi wydajność 'Również fałszywe. W rzeczywistości, jeśli w ogóle, FK może zaszkodzić wydajności, ale tylko rzadko do jakiegokolwiek zauważalnego stopnia, który uzasadnia usunięcie wtedy. – Brandon
@Kangkan tworząc FK nie ma nic wspólnego z wydajnością FK! = Indeksy. Istnieją DBMS automatycznie tworzy indeks w kreacji FK, ale większość nie. Przystawki nie potrzebują FK, proszę zapoznać się z doskonałą odpowiedzią Daniela. Być może OP jest zdezorientowany przez struktury ORM – jean