È meglio utilizzare chiavi esterne in tabelle o gli stessi risultati possono essere ottenuti con join?Chiavi esterne contro join
risposta
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_details
order_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).
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. –
@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). –
@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
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!
- 1. Django: Chiavi esterne distinte
- 2. Devo usare chiavi esterne?
- 3. Laravel + chiavi esterne nullable
- 4. SQL Chiavi esterne multiple come chiavi primarie
- 5. mysql - Chiavi esterne reciprocamente dipendenti
- 6. Come funzionano le chiavi esterne?
- 7. eliminazione di chiavi esterne duplicate
- 8. select_related con chiavi esterne inverse
- 9. TDD con HSQLDB - rimozione chiavi esterne
- 10. più chiavi esterne allo stesso tavolo
- 11. JPA 2: utilizzo multiplo colonna chiavi esterne
- 12. Come script indici, chiavi, chiavi esterne in SQL Server
- 13. Postgres e indici su chiavi esterne e chiavi primarie
- 14. Devo creare indici su chiavi esterne?
- 15. Più chiavi esterne a una singola colonna
- 16. e filtri chiavi esterne in Django
- 17. Django cascade delete sul retro chiavi esterne
- 18. EJB3NamingStrategy vs MigliovedNamingStrategy Denominazione delle chiavi esterne
- 19. Piano di esecuzione di chiavi esterne Oracle?
- 20. unire due tabelle con più chiavi esterne
- 21. Oracle tutti i riferimenti alle chiavi esterne
- 22. MySql Errore 150 - Le chiavi esterne
- 23. Devo usare davvero le chiavi esterne?
- 24. Linq a 3 tabelle senza chiavi esterne
- 25. SQLite - Contraints chiavi esterne - IO 5
- 26. Ereditarietà modello Django E chiavi esterne
- 27. Sqlite/SQLAlchemy: come imporre le chiavi esterne?
- 28. Django unico insieme (con chiavi esterne)
- 29. Sequenza, chiavi esterne come chiave primaria composta
- 30. Utilizzando Django bulk_create oggetti in chiavi esterne?
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
'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
@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