SQL: l’associazione N ad M nel modello E/R

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)
  • Iscrizione ha come chiave primaria composta (Matricola, CodCorso).
  • Matricola è chiave esterna verso Studente.
  • CodCorso è chiave esterna verso Corso.

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:

  1. Effettua un join tra Studente e Iscrizione usando Matricola.
  2. Effettua un join tra il risultato e Corso usando CodCorso.
  3. Applica una proiezione per restituire solo i campi Nome e Titolo.

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 DataIscrizione nell’esempio.
  • In algebra relazionale, le associazioni N a M sono trattate come relazioni ternarie ridotte a binarie, dove ogni join è ben definito e coerente.