2010-06-01 11 views
26

Czy lepiej jest używać kluczy obcych w tabelach, czy te same wyniki można osiągnąć przy łączeniach?Klucze zagraniczne kontra połączenia

+3

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

+2

'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

+1

@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

Odpowiedz

53

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

+1

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

+6

@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. –

+0

@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

22

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!

Powiązane problemy