Join: creare relazioni tra tabelle in MySQL

18 luglio 2006

Introduzione alle “Join” e relazioni uno a uno

In un precedente articolo avevamo offerto il modello teorico per eseguire relazioni tra tabelle in un database MySQL. In queste pagine affronteremo invece la realizzazione pratica delle relazioni che illustrate la volta scorsa. Innanzitutto è bene avere presente il concetto di JOIN (‘unione’) tra tabelle. Attraverso una query di tipo JOIN (vedremo che ne esistono varie tipologie) è possibile infatti ottenere come risultato di un’unica query un insieme di dati provenienti da tabelle differenti che presentino però una relazione tra di loro.

Facciamo l’esempio pratico di avere a disposizione due tabelle, utenti e indirizzi, legate tra di loro da una relazione uno a uno che, come abbiamo visto nel precedente articolo, ci permette di espanderea i record della tabella concettualmente principale aggiungendo dati facoltativi senza doverci ritrovare con un gran numero di campi vuoti.

Tabella utenti
ID | Nome     | Cognome
------------------------
1  | Mario    | Rossi
2  | Rosa     | Verdi
3  | Adelaide | Palone
4  | Alfonso  | Gambaro

Tabella indirizzi
Utente | Via                  | Cap   | Citta
------------------------------------------------
1      | via Goldoni, 45      | 20129 | Milano
2      | p.zza XXIV Maggio, 3 | 10111 | Genova
4      | via Garibaldi, 29    | 56100 | Pisa

Senza l’utilizzo della query di tipo JOIN avremmo dovuto eseguire una prima query sulla tabella utenti per estrarre i dati di nostro interesse dalla stessa, quindi per ogni record eseguire nuovamente una query sulla tabella indirizzi per trovare i dati presenti in essa: il risultato in questo caso sarebbe stato di far eseguire a MySQL ben cinque query. Un po’ di utenti in contemporanea ed ecco che un errore macroscopico di progettazione può rallentare un server fino al punto di bloccarlo.

Proviamo quindi ad eseguire la query seguente:

SELECT utenti.nome, utenti.cognome, indirizzi.via, indirizzi.cap,
indirizzi.citta FROM utenti, indirizzi

Ci aspetteremmo 4 risultati, invece ne otteniamo 12; com’è possibile?

Le query di tipo JOIN (in questo caso l’unione è implicita) creano un’unione cartesiana tra le tabelle collegate secondo le specifiche inserite per il collegamento. In pratica MySQL crea una nuova tabella virtuale in cui sono presenti tutti i campi di entrambe le tabelle originarie e per ogni record della prima vengono inseriti tanti record quanti sono quelli della seconda per ottenere tutte le combinazioni rese possibili dalle condizioni della tabella. In tal modo in questo caso si ritroverà l’utente “Mario Rossi” una volta con l’indirizzo di Milano, una volta con quello di Genova e una volta con quello di Pisa e la stessa cosa avverrà per tutti gli altri utenti.

Per evitare brutte sorprese è quindi bene specificare tutte le condizioni necessarie, facendo molta attenzione quando ad essere unite non sono solo due tabelle ma un numero maggiore: una sola query di questo tipo progettata male è in grado di occupare tutte le risorse del sistema data la mole di calcoli necessari per eseguirla.

SELECT utenti.nome, utenti.cognome, indirizzi.via, indirizzi.cap,
indirizzi.citta FROM utenti, indirizzi WHERE utenti.ID = via.utente

Se vuoi aggiornamenti su Join: creare relazioni tra tabelle in MySQL inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su Join: creare relazioni tra tabelle in MySQL

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy