Normalizzazione - Da Excel caotico a 3NF e BCNF | Informatica Anno 5 M1 L05 | Prof. Giagnotti
Informatica · Anno 5 · Modulo 1 · Lezione 05 — Ultima del Modulo
✍ Autore: profgiagnotti · Dal foglio Excel caotico allo schema pulito in 3NF e BCNF

Normalizzazione

Dal foglio Excel caotico allo schema pulito in 3NF e BCNF. Perché normalizzare, come riconoscere le anomalie e come costruire una base di dati che funzioni davvero — senza ridondanze, senza incoerenze e senza rimpianti il giorno dopo.

Anno 5 Modulo 1 Lezione 05 Normalizzazione 3NF BCNF ~30 min di lettura 📑 Stampa →
OBIETTIVI DI APPRENDIMENTO
✓Spiegare perché una base di dati va normalizzata e quali problemi previene
✓Definire e riconoscere la dipendenza funzionale come base teorica delle forme normali
✓Distinguere 1NF, 2NF, 3NF e BCNF e applicarle per eliminare ridondanze e anomalie
✓Riconoscere una relazione in 3NF che non è in BCNF — caso limite chiavi sovrapposte
✓Condurre processo completo: scenario → E/R → schema logico normalizzato in 3NF
📝 Nota personale del docente – Il mio metodo

Ve lo dico da subito, perché lo ripeterò fino alla noia: ho preferito costruire prima il modello concettuale anche in questa lezione, prima di mostrarti qualunque tabella. È un’abitudine che vale la pena consolidare subito, perché è quella che distingue una base di dati progettata bene da una “cresciuta a caso” un campo alla volta. Se partite da Excel e aggiungete colonne “perché servono”, state già sbagliando. Partite da “cosa voglio rappresentare?” non da “che tabella mi serve?”.

1. Perché si normalizza

Immagina di progettare una base di dati “di getto”, mettendo in un’unica grande tabella tutte le informazioni che ti vengono in mente: capiterà quasi certamente di ripetere gli stessi dati su più righe. Se in una tabella che registra le prenotazioni di un treno inserisci, riga per riga, anche il nome e la città dell’agenzia che ha gestito la prenotazione, quel nome e quella città si ripeteranno identici per ogni singola prenotazione gestita dalla stessa agenzia.

Questa ridondanza non è solo uno spreco di spazio: è la causa di tre problemi classici, noti come anomalie:

LE 3 ANOMALIE
Anomalia di inserimentoNon puoi registrare nuovaagenzia se non è associataad almeno una prenotazione.Dato “agenzia” prigionierodi dato “prenotazione” Anomalia di cancellazioneEliminando unica prenotazionegestita da un’agenzia, perdiogni info su quell’agenzia.DELETE che cancella piùdi quanto volevi Anomalia di aggiornamentoSe agenzia cambia città, deviaggiornare tutte le righe.Se ne dimentichi una,DB diventa incoerente.Incoerenza per UPDATEparziale
💼 Caso d’uso reale - E-commerce locale

In una mia consulenza per un e-commerce locale, il gestionale teneva tutto in una tabella: ordine + cliente + indirizzo + prodotto + fornitore + corriere. Quando un fornitore cambiava listino, l’admin doveva fare “cerca e sostituisci” in Excel esportato. Un giorno ha aggiornato solo 47 righe su 52: risultato, stesso prodotto con 3 prezzi diversi a seconda dell’ordine. Il cliente finale vedeva prezzi a caso. Questo è il costo reale di non normalizzare.

1.1 Dipendenza funzionale

Si dice che l’attributo B dipende funzionalmente da A (si scrive A → B) se per ogni valore di A esiste un solo valore di B. Oppure: conoscere A è sufficiente per determinare B. La dipendenza funzionale è la base teorica su cui si costruiscono tutte le forme normali.

DIPENDENZE FUNZIONALI CHE USEREMO PER TUTTA LA LEZIONE
matricola → nome, cognome, data_nascita codice_fiscale → nome, cognome, data_nascita, comune_nascita id_ordine → data_ordine, totale, id_cliente (id_ordine, id_prodotto) → quantità, prezzo_unitario ← PK composta Leggile così: "se conosco matricola, conosco univocamente il nome" Se questa regola non vale nel mondo reale, non è dipendenza funzionale valida.
💡 Consiglio - Come trovarle

Quando non sai da dove partire, fatti questa domanda per ogni coppia di attributi: “Se conosco X, conosco sempre e solo un valore di Y?”. Se la risposta è sì, hai trovato una dipendenza funzionale. Se la risposta è “dipende” o “a volte”, non è una dipendenza. Scrivetele su carta, non a mente. Io in classe le faccio scrivere tutte prima di disegnare una singola tabella.

2. Prima Forma Normale (1NF)

📖 Definizione formale ma umana - 1NF

Una tabella è in Prima Forma Normale (1NF) se e solo se: tutti gli attributi contengono valori atomici (non divisibili, non liste), non esistono gruppi ripetuti di attributi e la tabella ha una chiave primaria definita.

ESEMPIO VIOLAZIONE 1NF - PRODOTTI LISTA
Tabella ORDINE — violazione 1NF — campo prodotti lista id_ordineclienteprodotti — lista non atomica ❌quantità 1001Mario RossiPenna, Quaderno, Matita2, 1, 3 1002Anna BianchiMonitor1 PERCHÉ È SBAGLIATA: campo prodotti non atomico, più valori. Non posso fare query "tutti ordini che contengono Quaderno" senza LIKE, SUBSTRING. Ogni cella un solo valore. Punto. Errore che vedo nel 90% progetti studenti al primo tentativo.

2.2 Correzione → 1NF

Si divide ogni prodotto in una riga separata. La PK diventa composta: (id_ordine, id_prodotto).

CORREZIONE 1NF - RIGHE SEPARATE - PK COMPOSTA
Correzione 1NF — ogni prodotto riga separata — PK composta (id_ordine, id_prodotto) id_ordclienteid_prodnome_prodottoquantità 1001Mario RossiP01Penna2 1001Mario RossiP02Quaderno1 1001Mario RossiP03Matita3 1002Anna BianchiP04Monitor1 ✓ 1NF ok, ma introduce nuova anomalia: nome cliente ripetuto per ogni prodotto stesso ordine. NOTA DOCENTE: Abbiamo risolto un problema e ne abbiamo creato un altro. È normale: normalizzazione è percorso a tappe. Serve 2NF.

3. Seconda Forma Normale (2NF)

📖 Definizione - 2NF

Una tabella è in Seconda Forma Normale (2NF) se è in 1NF e tutti gli attributi non-chiave dipendono dall’intera chiave primaria, non solo da una parte di essa. La 2NF è rilevante solo quando la PK è composta da più attributi.

VIOLAZIONE 2NF - DIPENDENZA PARZIALE
Violazione 2NF — PK composta (id_ordine, id_prodotto) (id_ordine, id_prodotto) → quantità ✓ dipende da intera PK — ha senso id_ordine → cliente ✗ dipendenza PARZIALE — solo metà PK id_prodotto → nome_prodotto ✗ dipendenza PARZIALE — solo metà PK ERRORE TIPICO: "Ho tolto liste, quindi sono a posto". No. Se PK composta e attributo dipende solo da metà, sei in violazione 2NF.Regola d'oro: Se PK composta, ogni attributo non-chiave deve aver bisogno di TUTTA la PK.

3.2 Correzione → 2NF

Si separano gli attributi con dipendenza parziale in tabelle proprie:

CORREZIONE 2NF - 4 TABELLE
ORDINEid_ordine PK, id_cliente FK, data CLIENTEid_cliente PK, nome, cognome PRODOTTOid_prodotto PK, nome, prezzo DETTAGLIO_ORDINEFK:id_ordine, FK:id_prodotto, quantità — PK composta Ora ogni tabella contiene solo attributi che dipendono interamente dalla propria PK. Nessuna ridondanza nome cliente per ogni prodotto.

4. Terza Forma Normale (3NF)

📖 Definizione – La più importante per voi - 3NF

Una tabella è in Terza Forma Normale (3NF) se è in 2NF e nessun attributo non-chiave dipende da un altro attributo non-chiave. In altre parole: non esistono dipendenze transitive tra attributi non-chiave.

VIOLAZIONE 3NF - DIPENDENZA TRANSITIVA - CITTÀ → PROVINCIA
Tabella CLIENTE — violazione 3NF — dipendenza transitiva id_clinomecittàprovinciacap 1MarioMilanoMI20121 2AnnaRomaRM00100 3LucaMilanoMI20121 id_cliente → città ✓ dipende da PK città → provincia, cap ✗ TRANSITIVA: non-chiave dipende da non-chiave id_cliente → città → provincia, cap ✗ dipendenza TRANSITIVA Anomalia: Se CAP Milano cambia, devi aggiornare ogni riga cliente milanese. Se ne dimentichi una, DB inconsistente: 2 clienti Milano con CAP diversi.
CORREZIONE 3NF - ESTRAZIONE CITTÀ
CLIENTE(id_cliente PK, nome, cognome, FK:id_città)FK → CITTÀ CITTÀ(id_città PK, nome, provincia, cap)provincia e CAP esistono una sola volta per città Ora provincia e CAP una sola volta per città. Aggiornare CAP Milano = 1 UPDATE in CITTÀ. Cuore della 3NF.
🎯 Fino a dove spingersi - Consiglio pratico

Per le verifiche, per i progetti di quinta e per il 95% dei gestionali reali che farete nei prossimi anni, fermarsi alla 3NF è corretto e professionale. Non è pigrizia, è buon senso. Le forme superiori servono, ma la 3NF risolve già quasi tutte le anomalie che incontrerete. Se il vostro schema è in 3NF, siete già sopra la media.

5. La forma normale di Boyce-Codd (BCNF)

La terza forma normale risolve la maggior parte dei problemi di ridondanza, ma non tutti: esiste un caso particolare — piuttosto sottile — in cui una relazione è già in 3NF eppure presenta ancora ridondanza. Se n’è occupata la forma normale di Boyce-Codd (BCNF), proposta nel 1974 da Raymond Boyce e Edgar Codd.

📖 Definizione BCNF – da leggere con calma

Una relazione è in forma normale di Boyce-Codd se, per ogni dipendenza funzionale non banale X → Y presente nella relazione, l’insieme di attributi X è una superchiave (cioè contiene, o coincide con, una chiave candidata della relazione).

Differenza rispetto a 3NF: 3NF tollera dipendenza X → Y anche quando X non è superchiave, a condizione che Y sia attributo primo (parte di almeno una chiave candidata). BCNF elimina eccezione: pretende X sia sempre superchiave, senza eccezioni per attributi primi.

ESEMPIO 3NF MA NON BCNF - ISCRIZIONE STUDENTE MATERIA DOCENTE
Relazione ISCRIZIONE(Studente, Materia, Docente) — 3NF ma non BCNF Vincoli: (Studente, Materia) → Docente | Docente → Materia | Chiavi candidate: {Studente, Materia} e {Studente, Docente} StudenteMateriaDocente RossiBasi di DatiBianchi VerdiBasi di DatiBianchi NeriRetiGialli Ridondanza: ogni volta che compare "Bianchi", compare anche "Basi di Dati" — dipende solo da docente, ripetuta per ogni studente. Analisi: Docente → Materia — determinante Docente NON è superchiave (da solo non determina Studente) → viola BCNF Non viola 3NF, perché Materia è attributo primo (parte di chiave candidata {Studente, Materia}) — caso limite che 3NF lascia scoperto. Decomposizione in BCNF:DOCENTE_MATERIA(Docente PK, Materia) — Docente → Materia (Docente è chiave)STUDENTE_DOCENTE(Studente, Docente) — PK composta (Studente, Docente)
💬 Frase per non frustrarsi - BCNF ostica è normale

Se alla prima lettura la BCNF vi sembra ostica, è normale. Lo è stata anche per me quando l’ho studiata all’università. Il trucco che uso ancora oggi è questo: chiediti “questo determinante è una chiave? Da solo identifica tutta la riga?”. Se la risposta è no, sei fuori dalla BCNF. Ripassate l’esempio del docente: Docente da solo non identifica lo Studente, quindi non può essere chiave. Fine.

6. Il percorso di normalizzazione – visione d’insieme

PERCORSO DA NON NORMALIZZATO A BCNF
NON NORM.valori multiplifoglio Excel → 1NFatomici + PKno liste → 2NFno dip. parzialitutta PK → 3NFno transitivetarget scolastico ✅ → BCNFsuperchiavecasi particolari Per applicazioni scolastiche e maggior parte sistemi aziendali, 3NF è sufficiente. BCNF, 4NF, 5NF casi sottili universitari. De-normalizzare per performance (data warehouse) consapevolmente, non per pigrizia.

7. Esempio completo: gestione ordini dal caos alla 3NF

Partiamo da questa tabella piatta — come potrebbe essere un foglio Excel passato da un collega — e arriviamo a uno schema normalizzato in 3NF. È l’esercizio che vi farà capire perché la normalizzazione non è teoria astratta.

TABELLA DI PARTENZA NON NORMALIZZATA - FOGLIO EXCEL CAOTICO
Tabella partenza (non normalizzata) — Excel sporco id_orddatanome_clientecittàprovprodotti ❌qtà ❌prezzi ❌venditorezona 100110-01-24Mario RossiMilanoMIPenna, Quaderno2,10.50,2.00Giulia VerdiNord 100211-01-24Anna BianchiRomaRMMonitor1250.00Marco NeriCentro COSA NON VA: 1NF violata prodotti/qtà/prezzi liste. Ridondanza città→provincia. Transitiva venditore→zona. Esattamente tipo tabella che mi arriva quando mi dicono "prof, ho già fatto il database"
SCHEMA FINALE NORMALIZZATO IN 3NF - 6 TABELLE PULITE
Schema finale normalizzato in 3NF — da 1 tabella 10 colonne → 6 tabelle pulite CITTÀ(id_città PK, nome, provincia)1NF: atomici | 3NF: no transitiva prov da città separata ZONA_VENDITA(id_zona PK, nome)3NF: zona non dipende da venditore, è entità VENDITORE(id_vend PK, nome, FK:id_zona) CLIENTE(id_cli PK, nome, cognome, FK:id_città) PRODOTTO(id_prod PK, nome, prezzo_listino) ORDINE(id_ord PK, data, FK:id_cli, FK:id_vend) DETTAGLIO_ORDINE(FK:id_ord, FK:id_prod, quantità, prezzo_unitario)PK composta: (id_ord, id_prod) — 1NF eliminati valori multipli, 2NF no dip. parziali, 3NF no transitive RISULTATO: Ogni dato esiste in un solo posto. Prezzo prodotto si aggiorna una volta. Provincia città una volta. Nessuna anomalia. Caso d’uso: cliente cambia indirizzo 1 volta/anno, prodotto cambia prezzo 2 volte/anno, venditore cambia zona raramente. Con tabella piatta: caccia al tesoro. Con 6 tabelle: singolo UPDATE.
✅ Risultato della normalizzazione

Da 1 tabella con 10 colonne e anomalie evidenti siamo arrivati a 6 tabelle pulite. Ogni dato esiste in un solo posto. Il prezzo di un prodotto si aggiorna una sola volta. La provincia di una città è memorizzata una sola volta. Nessuna anomalia di inserimento, modifica o cancellazione. Questo è un database che potete far crescere per anni senza riscriverlo da zero.

❌ Errore che vedo sempre – la paura di “troppe tabelle”

“Prof, ma così ho troppe tabelle, non è più complicato?”. No. 6 tabelle piccole e chiare sono più semplici di 1 tabella enorme e incoerente. Le JOIN fanno paura solo la prima settimana, poi diventano naturali. La complessità vera è gestire dati duplicati.

8. Attività di laboratorio, quiz e riepilogo — chiusura modulo

🧪 Attività di laboratorio – Dal caos alla 3NF

Progetta tu: da Excel a schema normalizzato. Ti viene fornito un file ordini_sporchi.csv con tabella non normalizzata vista sopra (100 righe). Devi:
1. Individuare tutte le dipendenze funzionali A → B
2. Portare in 1NF: creare DETTAGLIO_ORDINE separando prodotti multipli
3. Portare in 2NF: estrarre CLIENTE, PRODOTTO, ORDINE
4. Portare in 3NF: estrarre CITTÀ e ZONA_VENDITA
5. Disegnare E/R e schema logico finale con PK e FK
6. Scrivere 3 query: totale per cliente, prodotti per città, fatturato per zona
Consegna: GitHub con .csv puliti + schema.png + query.sql – scadenza prossima lezione

Suggerimento: non partite da MySQL Workbench. Partite da carta e penna. Scrivete dipendenze funzionali. Se non le vedete su carta, non le vedrete nel tool.

MINI QUIZ - AUTOVALUTAZIONE RAPIDA - SVG CON NUMERAZIONE COLORATA MANTENUTA
1Tabella con PK (id_ordine, id_prodotto), attributo nome_cliente che dipende solo da id_ordine. È in 2NF?→ No, dipendenza parziale. Devi estrarre CLIENTE. 2Tabella CLIENTE(id, nome, città, provincia) dove città → provincia. È in 3NF?→ No, dipendenza transitiva. Devi estrarre CITTÀ. 3Relazione con Docente → Materia, ma Docente non è superchiave e Materia è attributo primo. È in 3NF? È in BCNF?→ È in 3NF (perché Materia è primo) ma NON in BCNF. Caso classico.
📌 Riepilogo – Da stampare e tenere vicino - Ultima del Modulo 1

La normalizzazione elimina ridondanze e le tre anomalie: di inserimento, di modifica e di cancellazione.
1NF: attributi atomici, nessun gruppo ripetuto, PK definita.
2NF: in 1NF + no dipendenze parziali (tutti i non-chiave dipendono dall’intera PK). Si applica solo se la PK è composta.
3NF: in 2NF + no dipendenze transitive (nessun non-chiave dipende da un altro non-chiave).
BCNF: per ogni dipendenza X → Y, X è superchiave. Più restrittiva della 3NF, risolve il caso delle chiavi sovrapposte.
Dipendenza funzionale (A → B) è la base teorica: B è univocamente determinato da A.
Per la maggior parte dei sistemi reali, la 3NF è il target. De-normalizzare consapevolmente per performance è accettabile, farlo per pigrizia no.

💜 Nota finale del docente – Per chi legge fino in fondo

Se siete arrivati fin qui, avete fatto la parte difficile. La normalizzazione non è un esercizio di stile per l’esame: è quello che vi salva quando, tra sei mesi, il cliente vi dirà “aggiungiamo un campo”. Con uno schema normalizzato, aggiungete un campo. Con una tabella piatta, riscrivete tutto. Io ho imparato questa lezione — come molti — riscrivendo tutto. Voi potete evitarlo. E se qualcosa non vi torna, tornateci domani. La BCNF, in particolare, ha bisogno di decantare. È normale.

🐙 Laboratori Pratici

Vuoi passare all'azione? Accedi alla repository ufficiale GitHub del corso per scaricare i file del laboratorio pratico in formato .md.

Vuoi consultare la sezione dedicata ai laboratori sul sito? Accedi cliccando il pulsante qui sotto.

🛠️ Sezione dedicata ai Laboratori

🎉 Fine Modulo 1 - Complimenti!

Avete chiuso il Modulo 1: da sistemi informativi a E/R, da modello logico ad algebra relazionale fino a normalizzazione 3NF e BCNF. Avete tutto per progettare un database che funziona davvero. Nel Modulo 2 passeremo a SQL DDL/DML, query, viste, indici e transazioni. Per ora: prendete il file ordini_sporchi.csv e portatelo in 3NF su carta. Se ci riuscite senza guardare appunti, siete pronti per il Modulo 2.