Oggi ti propongo tre esercizi svolti, uno per ciascun tipo di associazione (1 a 1, 1 a N, N a M), seguendo la logica dell’algebra relazionale e mostrando anche il corrispettivo in SQL, passo dopo passo. Useremo i concetti teorici dell’algebra relazionale come π
(proiezione), σ
(selezione), ⋈
(join naturale), e ρ
(rinominazione, se serve).
Esercizio 1 – Associazione 1 a 1
Testo
Ogni persona può avere al massimo una carta d’identità, e ogni carta d’identità appartiene ad una sola persona.
Schema relazionale
Persona(CF, Nome)
CartaIdentita(NumCarta, DataScadenza, CF)
CF
è chiave primaria inPersona
NumCarta
è chiave primaria inCartaIdentita
CF
è anche chiave esterna inCartaIdentita
riferita aPersona(CF)
Questa è una relazione 1 a 1, poiché ogni Persona
può avere al massimo una CartaIdentita
, e viceversa.
Obiettivo
Mostrare Nome, Numero della carta, Data di scadenza per tutte le persone che hanno una carta d’identità.
Algebra relazionale
π[Nome, NumCarta, DataScadenza](Persona ⋈ CartaIdentita)
SQL
SELECT Nome, NumCarta, DataScadenza
FROM Persona
JOIN CartaIdentita ON Persona.CF = CartaIdentita.CF;
Esercizio 2 – Associazione 1 a N
Testo
Un autore può scrivere più libri, ma ogni libro ha un solo autore.
Schema relazionale
Autore(CodAutore, Nome)
Libro(CodLibro, Titolo, CodAutore)
CodAutore
è chiave primaria inAutore
CodAutore
inLibro
è chiave esterna versoAutore
Associazione 1 a N: uno (autore) → molti (libri)
Obiettivo
Mostrare tutti i libri con il nome del loro autore.
Algebra relazionale
π[Titolo, Nome](Autore ⋈ Libro)
- Join tra
Autore
eLibro
usandoCodAutore
- Proiezione degli attributi
Titolo
eNome
SQL
SELECT Titolo, Nome
FROM Autore
JOIN Libro ON Autore.CodAutore = Libro.CodAutore;
Esercizio 3 – Associazione N a M
Testo
Gli studenti possono iscriversi a più corsi, e ogni corso può avere più studenti iscritti.
Schema relazionale
Studente(Matricola, Nome)
Corso(CodCorso, Titolo)
Iscrizione(Matricola, CodCorso)
Iscrizione
è la relazione intermedia- Chiave primaria composta:
(Matricola, CodCorso)
- Foreign key da
Iscrizione
aStudente
e aCorso
Associazione N a M
Obiettivo
Mostrare il nome dello studente e il titolo dei corsi a cui è iscritto.
Algebra relazionale (step by step)
- Join Studente con Iscrizione su
Matricola
Studente ⋈ Iscrizione
- Join con Corso su
CodCorso
(Studente ⋈ Iscrizione) ⋈ Corso
- Proiezione dei campi rilevanti
π[Nome, Titolo]((Studente ⋈ Iscrizione) ⋈ Corso)
SQL
SELECT Studente.Nome, Corso.Titolo
FROM Studente
JOIN Iscrizione ON Studente.Matricola = Iscrizione.Matricola
JOIN Corso ON Iscrizione.CodCorso = Corso.CodCorso;
✅ Riepilogo
Tipo | Chiave esterna | Tabella intermedia | Join |
---|---|---|---|
1 a 1 | Su uno dei due | ❌ | Diretto |
1 a N | Su lato “molti” | ❌ | Diretto |
N a M | Entrambi | ✅ | Due join |