Le forme normali di Codd, anche conosciute come normalizzazione del database, sono una serie di regole o criteri utilizzati nel progettare database relazionali per garantire l’organizzazione e l’efficienza dei dati. Le forme normali sono state sviluppate da Edgar F. Codd, uno dei pionieri dei database relazionali.

Autor nepoznat – http://en.wikipedia.org/wiki/Image:Edgar_F_Codd.jpg, https://hr.wikipedia.org/w/index.php?curid=89421
Cosa sono le forme normali
Ci sono diverse forme normali, indicate come 1NF, 2NF, 3NF, BCNF, 4NF, 5NF (o anche conosciuta come proiezione join o PNfP) e 6NF. Ognuna di queste forme rappresenta un livello crescente di suddivisione dei dati e una maggiore ridondanza eliminata.
Vediamo brevemente le prime tre forme normali.
1NF
Prima Forma Normale (1NF): Un’entità è in prima forma normale se tutti i suoi attributi sono atomici, cioè non possono essere ulteriormente suddivisi. Inoltre, non deve esserci alcuna duplicazione dei dati tra le righe.
La Prima Forma Normale (1NF) richiede che tutte le colonne di una tabella siano atomiche, il che significa che non devono contenere valori composti o multipli. Per comprendere meglio questa forma normale, ecco un esempio di una tabella non in 1NF e come può essere trasformata per soddisfare i requisiti della 1NF:
Supponiamo di avere una tabella che tiene traccia dei corsi di formazione offerti da un’azienda. La tabella potrebbe inizialmente sembrare così:
Tabella “Corsi” (Non in 1NF):
ID | Nome Corso | Docenti |
---|---|---|
1 | Corso di Matematica | Prof. Rossi, Prof. Bianchi |
2 | Corso di Informatica | Prof. Smith |
3 | Corso di Storia | Prof. Johnson |
In questa tabella, la colonna “Docenti” contiene valori multipli separati da virgole. Questo non è conforme alla 1NF poiché la colonna non è atomica.
Per portare questa tabella alla 1NF, dovremmo suddividere la colonna “Docenti” in righe separate, in modo che ogni cella contenga un singolo valore. Questo possiamo farlo facilmente aggiungendo una riga al database
Tabella “Corsi” (In 1NF):
ID | Nome Corso | Docente |
---|---|---|
1 | Corso di Matematica | Prof. Rossi |
4 | Corso di Matematica | Prof. Bianchi |
2 | Corso di Informatica | Prof. Smith |
3 | Corso di Storia | Prof. Johnson |
Ora la tabella è in Prima Forma Normale poiché tutte le colonne contengono valori atomici e non ci sono più valori multipli separati da virgole o altre delimitazioni.
La trasformazione in 1NF consente una migliore struttura dei dati, facilita le operazioni di interrogazione e rende il database più conforme agli standard di progettazione dei database relazionali.
2NF
Seconda Forma Normale (2NF): Un’entità è in seconda forma normale se è già in 1NF e se ogni attributo non chiave è completamente funzionalmente dipendente dalla chiave primaria. Ciò significa che non ci devono essere attributi che dipendono solo da una parte della chiave primaria.
La Seconda Forma Normale (2NF) richiede che una tabella sia in Prima Forma Normale (1NF) e che ogni attributo non chiave sia funzionalmente dipendente dalla chiave primaria. Per comprendere meglio la 2NF, consideriamo un esempio: supponiamo di avere una tabella chiamata “Ordini” che tiene traccia degli ordini dei clienti, in cui ogni ordine può contenere più prodotti.
La tabella potrebbe inizialmente apparire così.
Tabella “Ordini” (Non ancora in 2NF)
Numero Ordine | Cliente | Prodotto | Quantità |
---|---|---|---|
1 | Cliente A | Prodotto X | 5 |
1 | Cliente A | Prodotto Y | 3 |
2 | Cliente B | Prodotto X | 2 |
3 | Cliente A | Prodotto Z | 1 |
In questa tabella, la chiave primaria è composta da due colonne: “Numero Ordine” e “Prodotto”: nello specifico, la colonna “Cliente” dipende solo da “Numero Ordine” della chiave primaria, ma non da “Prodotto”. Questo significa che la tabella non è in 2NF. Per portare questa tabella alla 2NF, dobbiamo suddividere la tabella in due tabelle separate: una per le informazioni sugli ordini e l’altra per le informazioni sui prodotti.
Inoltre, creeremo una chiave esterna nella tabella degli ordini per collegare i prodotti agli ordini:
Tabella “Ordini” (In 2NF):
Numero Ordine | Cliente |
---|---|
1 | Cliente A |
2 | Cliente B |
3 | Cliente A |
Tabella “Dettagli Ordine” (In 2NF)
Numero Ordine | Prodotto | Quantità |
---|---|---|
1 | Prodotto X | 5 |
1 | Prodotto Y | 3 |
2 | Prodotto X | 2 |
3 | Prodotto Z | 1 |
Ora le tabelle sono in Seconda Forma Normale.
La tabella “Ordini” ha una chiave primaria composta da “Numero Ordine”, e la tabella “Dettagli Ordine” ha una chiave primaria composta da “Numero Ordine” e “Prodotto”. Inoltre, la dipendenza funzionale tra il “Cliente” e la chiave primaria della tabella “Ordini” è stata risolta. Questo schema migliora la struttura dei dati e rende il database più efficiente e conforme alla 2NF.
3NF
Terza Forma Normale (3NF): Un’entità è in terza forma normale se è già in 2NF e se ogni attributo non chiave è transitivamente dipendente dalla chiave primaria. Questo significa che non ci dovrebbero essere dipendenze transitive tra gli attributi.
La Terza Forma Normale (3NF) richiede che una tabella sia in Seconda Forma Normale (2NF) e che non ci siano dipendenze transitiva tra le colonne non-chiave. Per illustrare la 3NF, consideriamo un esempio: supponiamo di avere una tabella chiamata “Dipendenti” che tiene traccia delle informazioni sui dipendenti di un’azienda:
Tabella “Dipendenti” (Non in 3NF)
ID Dipendente | Nome | Dipartimento | Responsabile |
---|---|---|---|
1 | Alice | Vendite | Bob |
2 | Bob | Amministrazione | Carol |
3 | Carol | Risorse Umane | NULL |
In questa tabella, abbiamo le colonne “Nome” e “Dipartimento”, ma anche una colonna “Responsabile” che indica il responsabile di ciascun dipendente. La colonna “Responsabile” crea una dipendenza transitiva, poiché il “Responsabile” è in realtà un dipendente identificato dall’ID dipendente. Questo significa che la tabella non è in 3NF.
Per portare questa tabella alla 3NF, dobbiamo rimuovere la dipendenza transitiva. Questo può essere fatto suddividendo la tabella in due tabelle separate: una per le informazioni sui dipendenti e l’altra per le informazioni sui dipartimenti. Inoltre, nella tabella dei dipendenti, rimuoveremo la colonna “Responsabile” e creeremo una chiave esterna per collegare i dipendenti ai loro responsabili:
Tabella “Dipendenti” (In 3NF):
ID Dipendente | Nome | Dipartimento |
---|---|---|
1 | Alice | Vendite |
2 | Bob | Amministrazione |
3 | Carol | Risorse Umane |
Tabella “Responsabili” (In 3NF):
ID Dipendente | Responsabile |
---|---|
1 | 2 |
2 | 3 |
Ora le tabelle sono in Terza Forma Normale. La tabella “Dipendenti” ha una chiave primaria composta da “ID Dipendente,” e la colonna “Responsabile” è stata spostata in una tabella separata, eliminando così la dipendenza transitiva. La tabella “Responsabili” contiene le relazioni tra i dipendenti e i loro responsabili.
Questo schema migliora la struttura dei dati e rende il database più efficiente e conforme alla 3NF.
Queste prime tre forme normali sono le più comuni e spesso sono sufficienti per progettare database efficienti e ben strutturati. Tuttavia, in alcuni casi, è necessario considerare forme normali più avanzate come BCNF, 4NF, 5NF e 6NF per gestire situazioni più complesse di ridondanza e dipendenza dei dati.
4NF
La Quarta Forma Normale (4NF) è una forma normale avanzata che affronta le dipendenze multivalore tra gli attributi di una tabella. Per illustrare la 4NF, consideriamo un esempio di una tabella che contiene dipendenze multivalore:
Supponiamo di avere una tabella chiamata “Libri” che tiene traccia dei libri presenti in una biblioteca e delle diverse edizioni di ciascun libro:
Tabella “Libri” (Non in 4NF):
ISBN | Titolo | Edizioni |
---|---|---|
978-1-2345 | “Il Signore degli Anelli” | “2005 Paperback”, “2010 Hardcover” |
978-2-3456 | “1984” | “1990 Paperback”, “1995 Hardcover”, “2000 Ebook” |
In questa tabella, la colonna “Edizioni” contiene una dipendenza multivalore poiché ogni libro può avere più edizioni, ma queste edizioni sono rappresentate come una stringa delimitata da virgole. Questo non è conforme alla 4NF.
Per portare questa tabella alla 4NF, dobbiamo suddividere la tabella in due tabelle separate: una per le informazioni sui libri e l’altra per le informazioni sulle edizioni dei libri. La tabella delle edizioni dovrebbe includere una chiave esterna che collega ciascuna edizione al libro corrispondente:
Tabella “Libri” (In 4NF):
ISBN | Titolo |
---|---|
978-1-2345 | “Il Signore degli Anelli” |
978-2-3456 | “1984” |
Tabella “Edizioni Libri” (In 4NF):
ISBN | Edizione |
---|---|
978-1-2345 | “2005 Paperback” |
978-1-2345 | “2010 Hardcover” |
978-2-3456 | “1990 Paperback” |
978-2-3456 | “1995 Hardcover” |
978-2-3456 | “2000 Ebook” |
Ora le tabelle sono in Quarta Forma Normale. La tabella delle edizioni dei libri contiene una chiave primaria composta da “ISBN” e “Edizione,” e la dipendenza multivalore è stata risolta attraverso una tabella separata.
La 4NF è utile quando si affrontano situazioni di dipendenza multivalore complesse nei dati, ma va notato che non è sempre necessaria per tutti i database. La decisione di normalizzare fino alla 4NF dovrebbe essere basata sulle esigenze specifiche del database e sulla complessità dei dati.
BCNF
La Boyce-Codd Normal Form (BCNF) è una forma normale avanzata che affronta le dipendenze funzionali nei dati di una tabella. Per illustrare la BCNF, consideriamo un esempio:
Supponiamo di avere una tabella chiamata “StudentiCorsi” che tiene traccia delle iscrizioni degli studenti ai corsi in un’università:
Tabella “StudentiCorsi” (Non in BCNF):
Matricola | Nome Studente | Codice Corso | Nome Corso |
---|---|---|---|
1001 | Alice | CSCI101 | Introduzione a CS |
1002 | Bob | MATH201 | Algebra Lineare |
1001 | Alice | MATH201 | Algebra Lineare |
1003 | Carol | CSCI101 | Introduzione a CS |
In questa tabella, abbiamo le colonne “Matricola” e “Codice Corso,” ma il “Nome Corso” dipende solo dal “Codice Corso” e non dalla “Matricola.” Tuttavia, la “Matricola” è parte della chiave primaria insieme al “Codice Corso.” Questo crea una dipendenza funzionale non banale tra non-chiavi (il “Nome Corso”) e parte della chiave primaria. La tabella non è in BCNF a causa di questa dipendenza.
Per portare questa tabella alla BCNF, dobbiamo separare i dati delle iscrizioni degli studenti dai dati dei corsi e creare una tabella separata per i corsi. Inoltre, creeremo una chiave esterna nella tabella degli studenti per collegare gli studenti ai corsi a cui sono iscritti:
Tabella “Studenti” (In BCNF):
Matricola | Nome Studente |
---|---|
1001 | Alice |
1002 | Bob |
1003 | Carol |
Tabella “Corsi” (In BCNF):
Codice Corso | Nome Corso |
---|---|
CSCI101 | Introduzione a CS |
MATH201 | Algebra Lineare |
Tabella “Iscrizioni” (In BCNF):
Matricola | Codice Corso |
---|---|
1001 | CSCI101 |
1002 | MATH201 |
1001 | MATH201 |
1003 | CSCI101 |
Ora le tabelle sono in Boyce-Codd Normal Form (BCNF). La tabella “Iscrizioni” contiene solo dati relativi alle iscrizioni degli studenti e non ci sono dipendenze non banali tra non-chiavi e parte della chiave primaria.
La BCNF è una forma normale avanzata e spesso viene applicata a database complessi per garantire che non ci siano dipendenze funzionali anomale nei dati, migliorando così la struttura del database e la gestione delle informazioni.
Da non perdere 👇👇👇
- 🔒 Conosci meglio privacy e diritti digitali
- 👩💻 Impara a programmare in Python, C++, PHP
- 💻 Configura hosting e domini
- 📊 Tutto sui database
- 🛠️ Approfondisci le nuove tecnologie
- 🎮 Esplora la sezione retrogame
- 👀 Guarda i migliori servizi in offerta
- 🏁 Usa al meglio Excel
- 💬 Il nostro canale Telegram: iscriviti
- 🤩 Guida rapida alla schiuma spazio-temporale
- 😳 Come scaricare foto da Instagram
- 🤯 Cosa significa dimmerabile?