La Prima Forma Normale (First Normal Form, 1NF) è la fase iniziale della normalizzazione di un database che impone regole rigide sulla struttura delle tabelle. Una tabella è in 1NF se:
- Tutti i dati sono atomici. Ogni valore in una cella della tabella deve essere indivisibile. Addio, "liste in una cella"! In un database non si fa così.
- Ogni riga è unica. Cioè la tabella deve avere una chiave primaria (Primary Key) o un identificatore unico.
- Nessun gruppo di dati ripetuto. I valori della stessa entità non devono essere rappresentati nella stessa colonna.
Per dirla semplice, immagina che la tabella del database sia la tua stanza e i valori atomici siano oggetti separati: lampada, tavolo, libro. Se la stanza è un casino (tipo, tutte le cose buttate in un mucchio), non riuscirai a trovare la lampada o a capire al volo se hai un tavolo di riserva. La normalizzazione ti aiuta a "mettere tutto in ordine sugli scaffali".
Esempio di violazione della 1NF
Immagina di avere una tabella studenti dove salviamo le info sui corsi che frequentano:
| student_id | name | courses |
|---|---|---|
| 1 | Maria | "Matematica, Fisica" |
| 2 | Rob | "Biologia, Chimica" |
Perché questa struttura non va bene? I corsi (colonna courses) sono scritti separati da virgola in una sola cella. Questo significa che se vogliamo, per esempio, trovare tutti gli studenti che studiano fisica, la query diventa un incubo: bisogna fare trasformazioni di testo complicate. E se uno studente vuole togliere fisica dalla lista — ecco un altro problema. Questi dati non sono atomici, quindi violano la regola base della 1NF.
Come portare la tabella in 1NF?
Per risolvere il problema, dividiamo i dati in righe separate, dove ogni valore della tabella è atomico:
| student_id | name | course |
|---|---|---|
| 1 | Maria | Matematica |
| 1 | Maria | Fisica |
| 2 | Rob | Biologia |
| 2 | Rob | Chimica |
Ora va tutto bene. Abbiamo trasformato la nostra tabella in modo che ogni valore in una cella sia indivisibile. Questo rispetta i principi della 1NF.
Esempio dettagliato di violazione e correzione della 1NF
Supponiamo di avere una tabella ordini di un negozio online:
| order_id | customer_name | items |
|---|---|---|
| 1001 | Otto Lin | "Notebook, Mouse, Tastiera" |
| 1002 | Anna Song | "Smartphone, Custodia" |
Ovviamente qui items contiene più valori separati da virgola, il che viola la 1NF.
Per portare i dati in 1NF, salviamo una riga per ogni articolo nell’ordine:
| order_id | customer_name | item |
|---|---|---|
| 1001 | Otto Lin | Notebook |
| 1001 | Otto Lin | Mouse |
| 1001 | Otto Lin | Tastiera |
| 1002 | Anna Song | Smartphone |
| 1002 | Anna Song | Custodia |
Ora la struttura della tabella rispetta i principi della 1NF. Ogni ordine e articolo sono rappresentati come una riga separata e i valori sono atomici.
Aggiunta della chiave primaria
Dopo aver trasformato la tabella, è importante aggiungere un identificatore unico (chiave primaria) per ogni riga, così da garantirne l’unicità. Nell’esempio sopra puoi usare la combinazione di order_id e item come chiave primaria composta. Però nella vita reale di solito si crea un campo separato id.
| id | order_id | customer_name | item |
|---|---|---|---|
| 1 | 1001 | Otto Lin | Notebook |
| 2 | 1001 | Otto Lin | Mouse |
| 3 | 1001 | Otto Lin | Tastiera |
| 4 | 1002 | Anna Song | Smartphone |
| 5 | 1002 | Anna Song | Custodia |
Esercizio pratico
Hai una tabella studenti con le materie che studiano, tutte nella stessa cella:
| student_id | name | subjects |
|---|---|---|
| 1 | Polly | "Matematica, Chimica" |
| 2 | Peter | "Fisica, Informatica" |
Porta la tabella in una forma che rispetti la 1NF.
Dopo la trasformazione la tabella dovrebbe essere così:
| student_id | name | subject |
|---|---|---|
| 1 | Polly | Matematica |
| 1 | Polly | Chimica |
| 2 | Peter | Fisica |
| 2 | Peter | Informatica |
Errori più comuni quando si lavora con la 1NF
Quando lavori con un database, le violazioni della 1NF possono capitare in questi casi:
- Salvare liste o array direttamente nella tabella. Questo è l’errore più frequente.
- Mancanza di un identificatore unico per le righe (chiave primaria). Così la tua tabella rischia di avere dati duplicati.
- Usare più colonne per salvare la stessa informazione. Tipo "course_1", "course_2", "course_3" — invece della struttura giusta.
Tieni a mente questi punti e il tuo database rispetterà la Prima Forma Normale.
Applicazione pratica della 1NF
Nei progetti reali la 1NF è fondamentale. Per esempio:
- Nei CRM (Customer Relationship Management) i dati sui clienti e le loro azioni devono essere atomici. Così analisi e ricerca sono più semplici.
- Negli e-commerce la 1NF serve per salvare in modo efficiente info su ordini, prodotti e clienti.
- Nei sistemi bancari i dati su clienti, conti e transazioni devono essere atomici, per evitare confusione tra operazioni diverse.
Seguire i principi della 1NF aiuta a progettare database che reggono carichi elevati e restano facili da usare. Tutto ok, ma ora c’è duplicazione di dati. Per questo si passa alla Seconda Forma Normale (2NF), dove diventa più chiaro come gestire le dipendenze parziali nelle tabelle.
Perché è importante rispettare la Prima Forma Normale (1NF)? Immagina di salvare dati in una tabella dove in una cella ci sono più valori — tipo una lista di prodotti ordinati da un cliente. Così diventa difficile lavorare con i dati: cercare tutti quelli che hanno ordinato una "Tastiera" è una tortura. E se devi cambiare o cancellare parte delle info, è facile sbagliare. Quando i dati sono atomici — cioè ogni campo contiene solo un valore — lavorarci è più affidabile e chiaro. Inoltre, queste tabelle sono più facili da scalare, aggiornare e ristrutturare quando serve.
GO TO FULL VERSION