Salta ai contenuti
Manuale LogoManuale Logo

Relazioni tra tabelle

Le tabelle diventano utili anche per i collegamenti che stabiliscono tra loro.

In una scuola puoi avere studenti, classi, insegnanti e voti. Ogni elenco descrive un aspetto diverso; le relazioni mostrano come sono collegati.

In SQL questi collegamenti si chiamano relazioni.

Le relazioni più comuni sono tre:

  • uno a uno
  • uno a molti
  • molti a molti

Una relazione uno a uno significa che una riga di una tabella corrisponde a una sola riga di un’altra tabella.

Esempio: un utente può avere un solo profilo esteso.

Per esempio, un utente e il suo profilo esteso possono essere rappresentati da due righe collegate.

CREATE TABLE utenti (
id INT PRIMARY KEY,
email VARCHAR(150) NOT NULL
);
CREATE TABLE profili (
utente_id INT PRIMARY KEY,
bio VARCHAR(500),
FOREIGN KEY (utente_id) REFERENCES utenti(id)
);

Qui profili.utente_id identifica il profilo e, allo stesso tempo, punta all’utente collegato.

Questa è una delle relazioni più comuni.

Un cliente può avere molti ordini. Ma ogni ordine appartiene a un solo cliente.

CREATE TABLE clienti (
id INT PRIMARY KEY,
nome VARCHAR(100) NOT NULL
);
CREATE TABLE ordini (
id INT PRIMARY KEY,
cliente_id INT NOT NULL,
totale DECIMAL(10, 2) NOT NULL,
FOREIGN KEY (cliente_id) REFERENCES clienti(id)
);

La colonna cliente_id sta nella tabella ordini, perché ogni ordine deve ricordare a quale cliente appartiene.

Lo stesso schema vale per una biblioteca: un lettore può avere molti prestiti, ma ogni prestito appartiene a un lettore preciso.

Una relazione molti a molti significa che entrambe le parti possono collegarsi a più righe.

Per esempio:

  • un ordine può contenere molti prodotti
  • lo stesso prodotto può comparire in molti ordini

In questi casi si usa una tabella ponte.

CREATE TABLE righe_ordine (
ordine_id INT,
prodotto_id INT,
quantita INT,
PRIMARY KEY (ordine_id, prodotto_id),
FOREIGN KEY (ordine_id) REFERENCES ordini(id),
FOREIGN KEY (prodotto_id) REFERENCES prodotti(id)
);

righe_ordine collega ordini e prodotti. In più salva anche la quantità.

La tabella ponte registra quindi quale elemento di un insieme è collegato a quale elemento dell’altro.

Fai la domanda in entrambe le direzioni.

Per esempio:

  • un cliente può avere molti ordini?
  • un ordine può appartenere a molti clienti?

Se “molti” vale da una parte sola, probabilmente hai una relazione uno a molti.

Se “molti” vale da entrambe le parti, probabilmente ti serve una tabella ponte.

Una chiave esterna (FOREIGN KEY) vincola il collegamento tra due tabelle.

Senza questa regola, potresti salvare un ordine con cliente_id = 999 anche se non esiste nessun cliente con id 999.

Con la chiave esterna, il database controlla che il collegamento punti a una riga esistente.

  • Uno a uno: una riga corrisponde a una sola riga.
  • Uno a molti: una riga può collegarsi a molte righe.
  • Molti a molti: di solito serve una tabella ponte.
  • Le chiavi esterne aiutano il database a proteggere i collegamenti.