Perché creare riferimenti a chiavi esterne in DDL se si utilizza la clausola Where in SQL?

-1

Un semplice DB contenente due tabelle potrebbe essere:

CREATE TABLE Stock ( StockID INT StockDesc VARCHAR SupplierID INT PRIMARY KEY (StockID) FOREIGN KEY (SupplierID) REFERENCES Supplier(SupplierID))

CREATE TABLE Supplier ( SupplierID INT SupplierName VARCHAR PRIMARY KEY (SupplierID) )

(Supponiamo che ogni stockID abbia un solo fornitore)

Una tipica query SQL potrebbe essere:

SELECT StockID, StockDesc FROM Stock, Supplier WHERE Stock.SupplierID = Supplier.SupplierID AND SupplierName = "Smiths";

La mia comprensione fondamentale del design del database mi mette in guardia sul fatto che ho già stabilito che esiste una relazione tra le tabelle STOCK e SUPPLIER tramite il DDL. Perché SQL ha bisogno di riformulare nuovamente tale fatto nella prima clausola WHERE?

    
posta user3396486 13.04.2017 - 16:21
fonte

3 risposte

3

Nota: Supponendo che questa domanda riguardi i vincoli di chiave esterna piuttosto che la clausola WHERE , come WHERE sembra essere irrilevante alla domanda. Suppongo che tu intenda JOIN invece.

I riferimenti a chiave esterna sono vincoli sulla modifica di operazioni come INSERT , UPDATE e DELETE . Quando esiste un vincolo, impedisce a quelle operazioni di apportare modifiche che potrebbero comportare una struttura di dati che viola tale vincolo; i vincoli servono allo scopo di aiutare a far rispettare l'integrità / validità dei dati in un database prevenendo modifiche non valide.

I vincoli non sono così rilevanti per le operazioni di SELECT perché SELECT non è modificabile, quindi non c'è nulla da proteggere.

Lo scopo di un'istruzione SELECT è di recuperare le righe da una o più tabelle.  Le istruzioni SELECT restituiscono solo i dati dalle tabelle che hai richiesto esplicitamente di interrogare. Se non si specifica che si desidera recuperare i dati da una tabella di riferimento utilizzando JOIN , le eventuali voci referenziate tramite un vincolo di chiave esterna verranno escluse per impostazione predefinita dai risultati.

    
risposta data 13.04.2017 - 16:40
fonte
2

In realtà, alcuni ambienti SQL supportano NATURAL JOIN che si unisce a tutte le colonne comuni tra le due tabelle. Ecco il documento Oracle su di esso (altri database potrebbero supportarlo in modo diverso - consultare la documentazione del proprio sistema):

link

If the tables COUNTRIES and CITIES have two common columns named COUNTRY and COUNTRY_ISO_CODE, the following two SELECT statements are equivalent:

SELECT * FROM COUNTRIES NATURAL JOIN CITIES

SELECT * FROM COUNTRIES JOIN CITIES USING (COUNTRY, COUNTRY_ISO_CODE)

In pratica, vedo raramente che venga usato.

Personalmente non mi piace perché nasconde le relazioni tra i tavoli. Spesso sto lavorando su database che non ho creato io stesso e in realtà non so conoscere tutte le relazioni sottostanti a meno che non li osservi. Preferisco elencare esplicitamente le mie clausole di join, trovo che rende la query più chiara e più facile da capire, nonostante sia un po 'più lunga. Ma questa è solo la mia opinione. ;)

    
risposta data 13.04.2017 - 16:29
fonte
1

Ci saranno delle query a cui non potrai rispondere se la relazione è richiesta.

Fornisci un elenco di tutti i fornitori che non hanno stock.

Select s.SupplierName
from Supplier as s
left outer join Stock as k
on s.SupplierID = k.SupplierID
where k.StockID IS NULL;

Penso che il valore stia rendendo il codice un po 'più esplicito invece di avere troppi comportamenti di default. Per qualcuno che legge la tua domanda, ha davvero bisogno di memorizzare o cercare il design della tabella.

Salesforce.com ha una forma di SQL che ha un comportamento orientato agli oggetti, quindi i join sono impliciti perché si conformano al design del loro sistema come meglio credono. Per chi conosce lo standard SQL, è un modo diverso di apprendere e può essere fastidioso.

Per risparmiare su codifiche ripetute, puoi avvolgere la query con tutta la logica di join necessaria / ridondante in una vista o qualche altro oggetto di database riutilizzabile che incapsula questa roba.

    
risposta data 13.04.2017 - 19:52
fonte

Leggi altre domande sui tag