Normalizzazione fino alla 3NF
Prima, seconda e terza forma normale, con le anomalie che consentono di eliminare.
Normalizzazione fino alla 3NF è una lezione SQL Interview Prep gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Interview Prep, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Interview Prep include 4 lezioni in totale.
Perché gli intervistatori chiedono della normalizzazione
La normalizzazione è un fondamento della modellazione dei database e gli intervistatori la usano per verificare se comprende l’integrità dei dati a livello di progettazione. La domanda spesso suona così: "Che cos’è la normalizzazione e perché è importante?"
La normalizzazione è il processo di organizzazione di colonne e tabelle per ridurre la ridondanza e prevenire le anomalie di aggiornamento, inserimento e cancellazione. Ogni forma normale (1NF, 2NF, 3NF) aggiunge una regola più rigorosa.
Una risposta efficace indica le anomalie che la normalizzazione elimina, non si limita alle definizioni dei manuali.
Le tre anomalie
Prima di studiare le forme normali, impari a conoscere i problemi che risolvono. Una tabella progettata male, che memorizza tutto in un unico posto, presenta tre anomalie:
- Anomalia di aggiornamento: lo stesso fatto è memorizzato in molte righe, quindi una modifica deve interessarle tutte; in caso contrario, i dati diventano incoerenti.
- Anomalia di inserimento: non è possibile aggiungere un’informazione senza fornire anche dati non correlati (ad esempio, non si può aggiungere un prodotto senza un ordine).
- Anomalia di cancellazione: eliminando una riga si cancella accidentalmente un altro fatto indipendente.
Se riesce a individuare queste anomalie in una tabella di esempio, può motivare ogni passaggio della normalizzazione.
Una tabella iniziale non normalizzata
Ecco un classico esempio da colloquio: un’unica tabella molto ampia che mescola ordini, clienti e prodotti. Noti la ripetizione dell’e-mail del cliente e del prezzo del prodotto in più righe. È qui che si annidano le anomalie.
Durante il colloquio, il Suo compito è portare gradualmente questa tabella fino alla 3NF, spiegando ogni suddivisione.
-- Unnormalized: everything in one table
CREATE TABLE orders_flat (
order_id INT,
customer_id INT,
customer_email VARCHAR(255),
product_id INT,
product_name VARCHAR(100),
unit_price DECIMAL(10,2),
quantity INT
);Prima forma normale (1NF)
La 1NF richiede che ogni colonna contenga un unico valore atomico e che in una cella non siano presenti gruppi ripetuti o array.
Una tabella viola la 1NF se una colonna contiene un elenco separato da virgole come 'phone1, phone2' oppure se sono presenti colonne product1, product2, product3.
La soluzione consiste nell’assegnare a ogni valore una propria riga. L’intervistatore si aspetta di sentirLe dire: "valori atomici, nessun gruppo ripetuto e una chiave che identifichi ogni riga".
-- Violates 1NF: a list inside one column
-- phones = '555-1111, 555-2222'
-- 1NF fix: one phone per row
CREATE TABLE customer_phone (
customer_id INT,
phone VARCHAR(20),
PRIMARY KEY (customer_id, phone)
);Dipendenze funzionali
Per spiegare la 2NF e la 3NF deve usare il termine dipendenza funzionale. Scriviamo A -> B per indicare che "A determina B": a ogni valore di A corrisponde esattamente un valore di B.
Nella nostra tabella degli ordini:
customer_id -> customer_emailproduct_id -> product_name, unit_priceorder_id, product_id -> quantity
In sostanza, la normalizzazione consiste nell’assicurarsi che ogni colonna non appartenente alla chiave dipenda da tutta la chiave e da nient’altro che la chiave.
Seconda forma normale (2NF)
La 2NF si applica quando la chiave primaria è composta. Impedisce che una colonna non appartenente alla chiave dipenda solo da una parte della chiave (dipendenza parziale).
La chiave della nostra tabella delle righe d’ordine è (order_id, product_id). Tuttavia, product_name e unit_price dipendono solo da product_id, non dall’intera chiave. Si tratta di una dipendenza parziale, quindi la tabella viola la 2NF.
La soluzione consiste nello spostare gli attributi dei prodotti in una tabella products con chiave product_id.
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(100),
unit_price DECIMAL(10,2)
);
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (order_id, product_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);Terza forma normale (3NF)
La 3NF elimina le dipendenze transitive: una colonna non appartenente alla chiave dipende da un’altra colonna non appartenente alla chiave, invece che direttamente dalla chiave.
Supponiamo che una tabella orders contenga customer_id e customer_email. In questo caso, order_id -> customer_id -> customer_email. L’e-mail dipende dalla chiave solo attraverso customer_id: è una dipendenza transitiva.
La soluzione consiste nel separare i clienti in una tabella dedicata. Ora le colonne non appartenenti alla chiave di ogni tabella dipendono solo dalla chiave della tabella stessa.
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
customer_email VARCHAR(255)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);Il principio mnemonico in una riga
Gli intervistatori apprezzano chi sa riassumere la 3NF in una sola frase. La formulazione classica è:
"Ogni colonna non appartenente alla chiave deve dipendere dalla chiave, da tutta la chiave e da nient’altro che dalla chiave."
- La chiave -> 1NF (esiste una chiave e i valori sono atomici).
- Tutta la chiave -> 2NF (nessuna dipendenza parziale).
- Nient’altro che la chiave -> 3NF (nessuna dipendenza transitiva).
Questa singola frase consente di ricostruire tutte e tre le forme quando necessario.
BCNF: la domanda successiva
Un intervistatore particolarmente preparato potrebbe chiederLe della Boyce-Codd Normal Form (BCNF), una versione più rigorosa della 3NF.
La BCNF richiede che, per ogni dipendenza funzionale X -> Y, X sia una superchiave. La 3NF ammette una rara eccezione quando l’attributo dipendente fa parte di una chiave candidata; la BCNF elimina anche questa eccezione.
Nella pratica, è raro incontrare violazioni della BCNF, ma nominarla e dire "la BCNF è la 3NF senza eccezioni per gli attributi primi" dimostra una conoscenza approfondita.
Quando NON normalizzare
Una risposta di livello senior riconosce il compromesso. La normalizzazione migliora l’integrità, ma può penalizzare le prestazioni in lettura, perché per rispondere a una query sono necessari più join.
La denormalizzazione intenzionale è accettabile quando:
- Il carico di lavoro è incentrato sulle letture e i join rappresentano il collo di bottiglia.
- Si sta creando un livello di analisi o reportistica (gli schemi a stella saranno trattati più avanti).
- È possibile mantenere sincronizzata la copia ridondante (trigger, ETL, viste materializzate).
Dica: "Normalizzare per l’integrità OLTP; denormalizzare intenzionalmente per la velocità di lettura OLAP."
Alla lavagna
Metta insieme tutti i concetti. Durante un colloquio, quando Le viene presentata una tabella disordinata:
- Indichi la chiave candidata ed elenchi le dipendenze funzionali.
- Verifichi l’atomicità e l’eventuale presenza di gruppi ripetuti (1NF).
- Se la chiave è composta, verifichi la presenza di dipendenze parziali (2NF).
- Verifichi le dipendenze tra colonne non appartenenti alla chiave (3NF).
- Disegni le tabelle risultanti con chiavi primarie ed esterne.
Descrivere questi passaggi ad alta voce è esattamente ciò che l’intervistatore sta valutando.
Verifica rapida
Verifichi la Sua comprensione delle forme normali.
Riepilogo: normalizzazione fino alla 3NF
Ora è in grado di rispondere dall’inizio alla fine alla classica domanda da colloquio sulla normalizzazione:
- La normalizzazione elimina le anomalie di aggiornamento, inserimento e cancellazione riducendo la ridondanza.
- 1NF: valori atomici, nessun gruppo ripetuto.
- 2NF: nessuna dipendenza parziale da una chiave composta.
- 3NF: nessuna dipendenza transitiva (tra colonne non appartenenti alla chiave).
- Riassuma il concetto con "la chiave, tutta la chiave e nient’altro che la chiave".
- La BCNF rende la 3NF più rigorosa; denormalizzi intenzionalmente per le analisi con molte letture.
Domande Frequenti
La lezione «Normalizzazione fino alla 3NF» è gratuita?
Sì — il testo completo di «Normalizzazione fino alla 3NF» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Interview Prep, passa a CoddyKit PRO. Il corso SQL Interview Prep include 4 lezioni in totale.
Cosa imparerò in «Normalizzazione fino alla 3NF»?
Prima, seconda e terza forma normale, con le anomalie che consentono di eliminare. Eserciti SQL Interview Prep con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare SQL Interview Prep?
Non è richiesta alcuna esperienza precedente. SQL Interview Prep su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Normalizzazione fino alla 3NF»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione SQL Interview Prep?
Sì. Ogni lezione SQL Interview Prep include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Normalizzazione fino alla 3NF
- Modellazione ER e cardinalità delle relazioni
- Schema a stella e progettazione del data warehouse
- Serie completa di problemi per una simulazione di colloquio