Dal modello concettuale al modello logico e integrità referenziale

// obiettivi di apprendimento
Distinguere il modello concettuale (ER) dal modello logico (relazionale) e dal modello fisico
Applicare le regole di derivazione per tradurre un diagramma ER in tabelle relazionali
Comprendere il concetto di integrità referenziale e i comportamenti su UPDATE e DELETE
Saper svolgere per intero la derivazione di uno schema ER complesso (caso libro–autore)
📄
Slides
Regole di derivazione e tabella comportamenti FK
Scarica →

I tre livelli di astrazione

Progettare un database è un processo a tappe. Non si parte mai dal codice SQL: si inizia da una descrizione ad alto livello del dominio e si scende gradualmente verso l’implementazione. I tre livelli sono:

LivelloNomeStrumentoDomanda
1 — ConcettualeModello ERDiagramma Entità-RelazioneCosa voglio rappresentare?
2 — LogicoModello RelazionaleSchema tabelle / notazione R(A1, A2…)Come lo organizzo in tabelle?
3 — FisicoModello FisicoSQL DDL (CREATE TABLE…)Con quale DBMS lo implemento?
// perché separare i livelli

Il livello concettuale è indipendente da qualsiasi tecnologia: descrive il problema. Il livello logico è indipendente dal DBMS specifico: potremmo usare MySQL o PostgreSQL e lo schema rimarrebbe uguale. Il livello fisico invece dipende dal DBMS scelto (tipi di dato, engine, partitioning). Separare i livelli permette di cambiare tecnologia senza riprogettare tutto.

Le regole di derivazione

La traduzione dal modello concettuale al logico segue regole precise e meccaniche. Imparandole, sai tradurre qualsiasi diagramma ER in uno schema relazionale corretto.

Regola 1 — Ogni entità diventa una tabella

Ogni entità ER diventa una tabella. Gli attributi dell’entità diventano colonne. L’identificatore dell’entità diventa la chiave primaria (PK).

ER: Entità STUDENTE {matricola, nome, cognome, data_nascita}
STUDENTE(matricola, nome, cognome, data_nascita)

Regola 2 — Relazione 1:N → FK nella tabella lato N

La chiave primaria della tabella sul lato 1 viene aggiunta come chiave esterna alla tabella sul lato N.

ER: DIPARTIMENTO (1) ───── “ha” ───── (N) DIPENDENTE
DIPARTIMENTO(id_dip, nome, sede)
DIPENDENTE(id_dip_emp, nome, stipendio, FK:id_dip)

Regola 3 — Relazione 1:1 → FK in una delle due tabelle

Si mette la FK nella tabella “dipendente” o in quella che rende più senso semanticamente. Spesso è la tabella che non può esistere senza l’altra.

ER: PERSONA (1) ───── “possiede” ───── (1) PASSAPORTO
PERSONA(id_pers, nome, cognome)
PASSAPORTO(num_pass, data_rilascio, scadenza, FK:id_pers)

Regola 4 — Relazione N:M → tabella di giunzione

Si crea una nuova tabella con le FK di entrambe le entità. La PK della tabella di giunzione è solitamente la coppia delle due FK (chiave composta). Gli attributi di relazione finiscono qui.

ER: STUDENTE (N) ───── “frequenta” ───── (M) CORSO [attr: voto_finale]
STUDENTE(matricola, nome, cognome)
CORSO(id_corso, nome, crediti)
FREQUENTA(FK:matricola, FK:id_corso, voto_finale)

Regola 5 — Attributi multivalore → tabella separata

Se un’entità ha un attributo che può avere più valori (es. una persona con più numeri di telefono), non si possono mettere nella stessa riga. Si crea una tabella separata.

ER: PERSONA con attributo multivalore {telefoni}
PERSONA(id_pers, nome, cognome)
TELEFONO(id_tel, numero, tipo, FK:id_pers)

Caso studio completo: LIBRO e AUTORE

Vediamo l’applicazione di tutte le regole su un caso realistico. Una biblioteca digitale ha libri scritti da uno o più autori, e ogni autore può aver scritto più libri.

// schema ER (livello concettuale)
LIBRO {isbn, titolo, anno, genere, prezzo} AUTORE {id_autore, nome, cognome, nazionalita} EDITORE {id_editore, nome, paese}LIBRO ────── N:M ─────── AUTORE [attr: ruolo (es. coautore, curatore)] LIBRO ────── N:1 ─────── EDITORE
// schema logico (livello logico)
EDITORE(id_editore, nome, paese)LIBRO(isbn, titolo, anno, genere, prezzo, FK:id_editore)AUTORE(id_autore, nome, cognome, nazionalita)LIBRO_AUTORE(FK:isbn, FK:id_autore, ruolo)
// analisi della derivazione

EDITORE è sul lato 1 della relazione con LIBRO → la FK va in LIBRO. Il campo id_editore in LIBRO punta alla PK di EDITORE. La relazione N:M LIBRO–AUTORE genera la tabella di giunzione LIBRO_AUTORE. L’attributo ruolo descrive la relazione (coautore, curatore, traduttore) e non potrebbe stare né in LIBRO né in AUTORE.

Integrità referenziale

// definizione formale
Integrità referenziale: un vincolo che garantisce che ogni valore di una chiave esterna corrisponda a un valore esistente nella chiave primaria della tabella referenziata. Non devono esistere record orfani, cioè figli senza padre.

Il DBMS applica questo vincolo automaticamente se dichiarato. Tre situazioni possono violare l’integrità referenziale, e per ognuna esistono comportamenti configurabili:

Caso 1 — INSERT su tabella figlia

// errore

Si prova ad inserire un ORDINE con id_cli = 999 ma il cliente 999 non esiste. → Il DBMS restituisce errore e l’INSERT viene rifiutato. Non c’è alcuna opzione di comportamento: è sempre un errore.

Caso 2 — UPDATE della PK padre

Si vuole aggiornare la PK di un CLIENTE che ha già ordini. Cosa succede agli ordini che puntano alla vecchia PK?

ComportamentoCosa faQuando usarlo
CASCADEAggiorna automaticamente tutte le FK figliePK naturale che può cambiare (es. codice fiscale)
RESTRICT / NO ACTIONBlocca l’UPDATE se esistono figliPK artificiale (auto-increment) — non dovrebbe mai cambiare
SET NULLImposta la FK figlia a NULLRelazione opzionale, figlio può esistere senza padre

Caso 3 — DELETE del record padre

Si vuole eliminare un CLIENTE. Cosa succede ai suoi ordini?

ComportamentoCosa faEsempio d’uso
CASCADEElimina in cascata tutti i figliElimina un post → elimina tutti i commenti
RESTRICTBlocca il DELETE se esistono figliNon puoi eliminare un cliente con ordini in corso
SET NULLImposta la FK figlia a NULLElimina un autore → i libri rimangono senza autore assegnato
SET DEFAULTImposta la FK al valore di defaultMeno comune, usato per riassegnare a un record “generico”
// attenzione CASCADE

ON DELETE CASCADE è potente ma pericoloso: elimina in modo silenzioso migliaia di record figli. Usalo solo dove la logica applicativa lo richiede esplicitamente (es. relazioni di proprietà: elimina utente → elimina tutti i suoi dati). Evitalo dove i dati figli hanno valore indipendente (es. ordini storici, dati contabili).

Schema finale con vincoli dichiarati

Una buona pratica è annotare esplicitamente i comportamenti FK già nel livello logico, prima di scrivere il DDL:

EDITORE(id_editore, nome, paese)LIBRO(isbn, titolo, anno, genere, prezzo, FK:id_editore → EDITORE ON DELETE RESTRICT ON UPDATE CASCADE)AUTORE(id_autore, nome, cognome, nazionalita)LIBRO_AUTORE(FK:isbn → LIBRO ON DELETE CASCADE, FK:id_autore → AUTORE ON DELETE RESTRICT, ruolo)

Se eliminiamo un libro, ha senso che scompaiano le associazioni autore-libro (CASCADE). Se eliminiamo un autore, non possiamo farlo se esistono libri a lui collegati, per non creare orfani (RESTRICT).

📌 Riepilogo — Punti chiave
  • Tre livelli: Concettuale (ER) → Logico (tabelle) → Fisico (SQL DDL). Si progetta sempre dall’alto verso il basso.
  • Regole di derivazione: entità → tabella; 1:N → FK nel lato N; 1:1 → FK in una tabella; N:M → tabella di giunzione; multivalore → tabella separata.
  • Integrità referenziale: ogni FK deve puntare a una PK esistente. I DBMS la garantiscono se dichiarata.
  • Su UPDATE/DELETE del padre: CASCADE propaga, RESTRICT blocca, SET NULL azzera la FK.
  • ON DELETE CASCADE è potente ma va usato con consapevolezza: elimina silenziosamente tutti i figli.

Lascia un commento