2010-06-01 22 views
26

È meglio utilizzare chiavi esterne in tabelle o gli stessi risultati possono essere ottenuti con join?Chiavi esterne contro join

+3

Qual è la differenza? I join sono definiti utilizzando solo chiavi esterne. Naturalmente, potresti non definire la chiave esterna nel database. L'utilizzo della chiave esterna migliorerà le prestazioni (a condizione che la selezione della chiave esterna sia corretta). – Kangkan

+2

'I join sono definiti utilizzando solo chiavi esterne 'False! 'L'uso di chiavi esterne migliorerà le prestazioni. Anche falso. Infatti, se mai, gli FK possono danneggiare le prestazioni, anche se solo raramente fino a un livello evidente che giustifica la rimozione. – Brandon

+1

@Kangkan la creazione di FK non ha nulla a che fare con le prestazioni FK! = Indexes. Ci sono DBMS automatici crea un indice nella creazione FK ma la maggior parte no. Le unioni non hanno bisogno di FK, per favore riferisciti all'eccellente risposta di Daniel. Forse OP è confuso dai framework ORM – jean

risposta

53

Foreign keys sono solo dei vincoli per far rispettare referential integrity. Sarà comunque necessario utilizzare JOINs per creare le tue query.

chiavi esterne garantire che una riga in una tabella con un campo order_detailsorder_id riferimento a un tavolo orders non avrà mai un valore order_id che non esiste nella tabella orders. Le chiavi esterne non sono richieste per avere un database relazionale funzionante (infatti il ​​motore MySQL's default storage non supporta FK), ma sono assolutamente essenziali per evitare relazioni interrotte e file orfani (cioè integrità referenziale).

+1

Voglio solo far notare che sebbene FK sia cool, è piuttosto scadente il design per * contare * sul DB per la logica dell'applicazione. La tua applicazione potrebbe interrompersi senza aggiornamenti al tuo database (moltiplicato per installazioni). Può anche minimizzarlo. –

+6

@sims: non considero "l'integrità referenziale" come logica dell'applicazione. La capacità di applicare l'integrità referenziale a livello di database è richiesta per la C in [ACID] ​​(http://en.wikipedia.org/wiki/ACID). –

+0

@sims: Sono d'accordo con Daniel, ma vorrei estendere il suo ragionamento. IMO RI fa parte della business logic (o 'data logic') deve essere applicato da qualche parte (ONCE, non ripeterti). Poiché il DB è l'autorità di dati centrale/finale, i dati devono essere validi lì, quindi il suo punto che richiama ACID è corretto! – lexu

22

FOREIGN KEY s e JOIN s non fanno la stessa cosa!

  • Un FOREIGN KEY fa rispettare l'integrità dei dati, assicurandosi che il dato conferma ad alcune regole quando viene aggiunto al DB.
  • A JOIN viene utilizzato quando si estraggono/query dati dal DB dando regole su come selezionare i dati.

  • JOIN s lavoro se ci sono FK o meno.

  • FK funziona se si estrae dati con o senza JOIN s.

conclusione FK e JOIN non consentono di raggiungere lo stesso obiettivo!