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 inPersonaNumCartaè chiave primaria inCartaIdentitaCFè anche chiave esterna inCartaIdentitariferita 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 inAutoreCodAutoreinLibroè 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
AutoreeLibrousandoCodAutore - Proiezione degli attributi
TitoloeNome
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
IscrizioneaStudentee 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
MatricolaStudente ⋈ 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 |
