L’associazione N a M è tra le più flessibili e potenti nei database relazionali. Anche se richiede una tabella di collegamento, è perfettamente gestibile sia in SQL che nell’algebra relazionale, grazie all’uso di chiavi esterne, chiavi composte e join. L’algebra relazionale ci fornisce un formalismo preciso e matematicamente fondato per comprendere e verificare la correttezza delle strutture e delle interrogazioni.
Associazione N a M in SQL tramite Algebra Relazionale
Quando si modella un database relazionale, le associazioni tra entità non sono sempre semplici relazioni uno-a-uno o uno-a-molti. In molti casi reali, si ha una relazione molti-a-molti (N a M) tra due entità. Questo tipo di associazione è essenziale in scenari dove più elementi di una tabella possono essere collegati a più elementi di un’altra.
Vediamo come modellare e interpretare questa relazione in SQL e nell’algebra relazionale.
Cos’è un’associazione N a M?
In un’associazione N a M:
- Un elemento della prima entità può essere associato a più elementi della seconda.
- E viceversa, un elemento della seconda può essere associato a più elementi della prima.
Esempio classico:
Uno studente può iscriversi a più corsi, e un corso può essere seguito da più studenti.
Modellazione relazionale
Per rappresentare una relazione N a M nel modello relazionale, si crea una tabella intermedia (detta anche relazione di associazione), che contiene le chiavi primarie delle due entità e funge da ponte.
Schema relazionale:
Studente(Matricola, Nome)
Corso(CodCorso, Titolo)
Iscrizione(Matricola, CodCorso)
Iscrizioneha come chiave primaria composta(Matricola, CodCorso).Matricolaè chiave esterna versoStudente.CodCorsoè chiave esterna versoCorso.
Espressione in algebra relazionale
In algebra relazionale, l’associazione N a M viene rappresentata mediante un join tra le tabelle principali tramite la tabella ponte.
Esempio: elencare tutti gli studenti con i corsi a cui sono iscritti
π[Nome, Titolo] ( (Studente ⋈ Iscrizione) ⋈ Corso )
Questa operazione:
- Effettua un join tra Studente e Iscrizione usando
Matricola. - Effettua un join tra il risultato e Corso usando
CodCorso. - Applica una proiezione per restituire solo i campi
NomeeTitolo.
Rappresentazione SQL
In SQL, la corrispondente struttura si definisce così:
CREATE TABLE Studente (
Matricola INT PRIMARY KEY,
Nome VARCHAR(100)
);
CREATE TABLE Corso (
CodCorso INT PRIMARY KEY,
Titolo VARCHAR(100)
);
CREATE TABLE Iscrizione (
Matricola INT,
CodCorso INT,
PRIMARY KEY (Matricola, CodCorso),
FOREIGN KEY (Matricola) REFERENCES Studente(Matricola),
FOREIGN KEY (CodCorso) REFERENCES Corso(CodCorso)
);
E la query equivalente in SQL:
SELECT Studente.Nome, Corso.Titolo
FROM Studente
JOIN Iscrizione ON Studente.Matricola = Iscrizione.Matricola
JOIN Corso ON Iscrizione.CodCorso = Corso.CodCorso;
Proprietà dell’associazione N a M
Nel modello relazionale e nell’algebra relazionale:
- L’associazione N a M non può essere rappresentata direttamente con una sola foreign key: è necessario introdurre una relazione intermedia.
- Le chiavi primarie delle entità collegate diventano foreign key nella tabella ponte.
- Il join su più relazioni tramite la tabella intermedia consente di navigare e interrogare correttamente l’associazione.
Considerazioni aggiuntive
- La tabella intermedia può anche contenere attributi propri, come una
DataIscrizionenell’esempio. - In algebra relazionale, le associazioni N a M sono trattate come relazioni ternarie ridotte a binarie, dove ogni join è ben definito e coerente.
