Una tabella si considera in seconda forma normale se:
- È già in prima forma normale (1NF).
- Ogni colonna non chiave dipende da tutta la chiave primaria, e non solo da una parte della chiave.
Se la chiave primaria è composta da più campi (chiave composta), nessun attributo non chiave (colonna) deve dipendere solo da una parte di questa chiave. In altre parole, la 2NF elimina le dipendenze parziali.
Esempio di violazione della 2NF
Supponiamo di avere una tabella student_courses (Studenti e Corsi), che memorizza informazioni sugli studenti, i loro corsi e i docenti:
| student_id | course_id | course_name | instructor_name |
|---|---|---|---|
| 1 | 101 | Matematica | Lin |
| 1 | 102 | Letteratura | Song |
| 2 | 101 | Matematica | Lin |
student_idecourse_idinsieme formano la chiave primaria composta.- Ma fai attenzione alle colonne
course_nameeinstructor_name. Dipendono solo dacourse_id, non dall'intera coppia (student_id,course_id).
Ecco qui, una dipendenza parziale! course_name e instructor_name dipendono solo da una parte della chiave composta (course_id). Questo viola i principi della 2NF.
Portare la tabella in 2NF
Il nostro obiettivo è eliminare la dipendenza parziale, dividendo la tabella in due. Così eliminiamo la ridondanza e miglioriamo la coerenza dei dati.
Separiamo le informazioni sui corsi in una tabella a parte, courses:
| course_id | course_name | instructor_name |
|---|---|---|
| 101 | Matematica | Lin |
| 102 | Letteratura | Song |
La tabella principale diventa così:
| student_id | course_id |
|---|---|
| 1 | 101 |
| 1 | 102 |
| 2 | 101 |
Ora ogni colonna dipende da tutta la chiave primaria. Abbiamo separato i dati in modo logico e risolto la violazione della 2NF.
La magia dell'eliminazione della ridondanza
Dai un'occhiata alla tabella prima della normalizzazione. Nella colonna instructor_name si ripete il nome "Lin". E quanti di questi duplicati potrebbero esserci in un database reale con migliaia di record? Dividendo le tabelle abbiamo eliminato la ridondanza e ridotto il rischio di errori, tipo refusi ("Lin" vs "Ling").
Esempio dalla vita reale
Immagina di gestire gli ordini dei prodotti. Hai la seguente tabella order_items (ordini e prodotti), dove order_id e item_id formano la chiave primaria:
| order_id | item_id | item_name | price |
|---|---|---|---|
| 1 | 101 | Laptop | 50000 |
| 1 | 102 | Mouse | 1000 |
| 2 | 101 | Laptop | 50000 |
Come vedi, i prezzi e i nomi dei prodotti si ripetono. Questo è un segno di violazione della 2NF, perché item_name e price dipendono solo da item_id.
Per portare la tabella in 2NF creiamo la tabella items:
| item_id | item_name | price |
|---|---|---|
| 101 | Laptop | 50000 |
| 102 | Mouse | 1000 |
E modifichiamo la tabella order_items, lasciando solo gli identificatori di ordine e prodotto:
| order_id | item_id |
|---|---|
| 1 | 101 |
| 1 | 102 |
| 2 | 101 |
Ora i dati sono puliti come il codice dopo una code review — niente più ridondanza.
Esercizio pratico: prova tu!
Supponi di avere una tabella employee_projects, che contiene informazioni sui dipendenti, i loro progetti e i manager dei progetti:
| employee_id | project_id | project_name | manager_name |
|---|---|---|---|
| 1 | 201 | CRM Upgrade | Lin |
| 2 | 202 | Website Revamp | Ming |
| 1 | 202 | Website Revamp | Ming |
Prova a:
- Trovare le dipendenze che violano i requisiti della 2NF.
- Dividere la tabella in due, eliminando la violazione.
Perché è importante rispettare la 2NF?
Perché dovresti rispettare la seconda forma normale (2NF)? Semplice: per evitare che i dati si duplicano e creino confusione. Quando elimini le dipendenze parziali, le tabelle diventano più pulite — senza informazioni ripetute, come lo stesso nome del docente in ogni riga. Risparmi spazio e riduci il rischio di inconsistenze: aggiorni un nome in un posto solo — ed è subito aggiornato ovunque.
In più, scrivere query su un database così è più facile: quando la struttura è logica e i dati non sono sparsi in mille righe, filtrare e raggruppare è più veloce e affidabile. Sì, il prezzo da pagare sono query SQL un po' più complesse con JOIN, perché le tabelle aumentano. Ma meglio un JOIN che cento righe con gli stessi cognomi. Nella maggior parte dei casi, la normalizzazione vale la pena.
Integrazione nei progetti reali
Conoscere la 2NF ti sarà utile:
- Quando progetti un database: ti aiuta a evitare il caos nelle tabelle.
- Al colloquio: spesso ti chiedono di spiegare o portare tabelle in forma normale.
- Sul lavoro vero: quando ti affidano l'ottimizzazione di un database esistente, spezzando tabelle "monolitiche" in tabelle normalizzate.
La seconda forma normale (2NF) aiuta a eliminare le dipendenze parziali in una tabella dove la chiave primaria è composta. Dividiamo le tabelle in blocchi logici, così che ogni colonna dipenda solo da tutta la chiave, non da una sua parte. Questo migliora la qualità del database, elimina la ridondanza e lo rende più flessibile. Pronti per la terza forma normale? Andiamo avanti!
GO TO FULL VERSION