· Andrea Pollini · basi dati · 5 min read
Forme normali di una tabella di database
Le forme normali sono un insieme di regole per ridurre al minimo le anomalie e garantire la coerenza e l'integrità dei dati.
Anomalie nelle tabelle di database
Nel contesto delle basi di dati e delle forme normali, un’anomalia si riferisce a una situazione indesiderata o a un risultato imprevisto che può verificarsi durante l’aggiornamento, l’inserimento o l’eliminazione di dati in una tabella. Queste anomalie possono verificarsi quando i dati non sono organizzati in modo efficiente o quando una tabella non soddisfa adeguatamente le forme normali.
Ecco un esempio di anomalia di inserimento e di aggiornamento utilizzando tabelle in markdown:
Esempio di Anomalia di Inserimento:
Supponiamo di avere una tabella Studenti
in cui memorizziamo informazioni sugli studenti e i corsi che stanno frequentando:
ID_Studente | Nome_Studente | Corso1 | Corso2 | Corso3 |
---|---|---|---|---|
1 | Mario | Matematica | Fisica | Informatica |
2 | Laura | Storia | NULL | NULL |
In questo caso, l’anomalia di inserimento si verifica quando vogliamo aggiungere un nuovo studente (ad esempio, ID_Studente = 3) che non sta seguendo alcun corso. Non possiamo farlo senza introdurre valori NULL in tutte le colonne dei corsi, creando così una situazione indesiderata.
Esempio di Anomalia di Aggiornamento:
Consideriamo la stessa tabella Studenti
e supponiamo che lo studente con ID_Studente = 1 cambi corso da Matematica a Storia. Per fare ciò, dobbiamo aggiornare tutte le righe in cui compare Mario:
ID_Studente | Nome_Studente | Corso1 | Corso2 | Corso3 |
---|---|---|---|---|
1 | Mario | Storia | Fisica | Informatica |
2 | Laura | Storia | NULL | NULL |
In questo esempio, l’anomalia di aggiornamento richiede la modifica di più righe, e ciò potrebbe portare a errori o a inconsistenze se l’operazione di aggiornamento non viene eseguita correttamente su tutte le righe coinvolte.
forme normali
Esistono tre principali forme normali (1NF, 2NF, 3NF) e l’obiettivo principale di aderire a queste forme è ridurre al minimo le anomalie nelle tabelle del database. Vediamo brevemente cosa significano:
Prima Forma Normale (1NF): Richiede che ogni colonna della tabella contenga solo valori atomici (valori indivisibili) e che non ci siano gruppi ripetitivi di colonne.
Seconda Forma Normale (2NF): Richiede che la tabella sia già in 1NF e che ogni colonna che non faccia parte di una chiave primaria sia completamente dipendente dalla chiave primaria.
Terza Forma Normale (3NF): Richiede che la tabella sia già in 2NF e che non ci siano dipendenze transitive tra le colonne non chiave.
Le anomalie possono manifestarsi in diverse forme:
Anomalia di Inserimento: Impossibilità di inserire dati in una tabella senza avere accesso a informazioni aggiuntive.
Anomalia di Aggiornamento: Necessità di aggiornare gli stessi dati in più righe, con il rischio di errori o incongruenze.
Anomalia di Cancellazione: Eliminazione accidentale di dati importanti quando si cancella una riga.
L’adesione alle forme normali aiuta a ridurre o eliminare queste anomalie, garantendo una struttura dei dati ben organizzata e riducendo il rischio di errori durante l’aggiornamento, l’inserimento o l’eliminazione dei dati.
Esempi
Esempio di Prima Forma Normale (1NF)
Supponiamo di avere una tabella Libri
che registra informazioni sui libri e gli autori, e notiamo che la tabella attuale non è in Prima Forma Normale (1NF). Ecco come potrebbe apparire la tabella:
Tabella Libri (Non in 1NF):
ID_Libro | Titolo | Autore | Generi |
---|---|---|---|
1 | ”Il Signore degli Anelli” | J.R.R. Tolkien | Fantasia, Avventura |
2 | ”1984” | George Orwell | Distopia, Politica |
3 | ”Harry Potter” | J.K. Rowling | Fantasy, Magia |
In questa tabella, la colonna Generi
contiene più valori separati da virgola, violando la Prima Forma Normale in quanto non contiene solo valori atomici.
Anomalie presenti:
Anomalia di Inserimento: Non possiamo inserire un nuovo libro senza specificare tutti i generi associati. Ad esempio, se volessimo inserire un libro senza specificare il genere, ciò non sarebbe possibile senza introdurre un valore nullo o vuoto.
Anomalia di Aggiornamento: Se volessimo modificare o aggiungere un genere per un libro specifico, dovremmo aggiornare la riga corrispondente, comportando la modifica di una lista separata da virgole.
Per renderla in Prima Forma Normale, dobbiamo suddividere la colonna Generi
in righe distinte e associarle al libro corrispondente:
Tabella Libri (In 1NF):
ID_Libro | Titolo | Autore | Genere |
---|---|---|---|
1 | ”Il Signore degli Anelli” | J.R.R. Tolkien | Fantasia |
1 | ”Il Signore degli Anelli” | J.R.R. Tolkien | Avventura |
2 | ”1984” | George Orwell | Distopia |
2 | ”1984” | George Orwell | Politica |
3 | ”Harry Potter” | J.K. Rowling | Fantasy |
3 | ”Harry Potter” | J.K. Rowling | Magia |
In questo modo, ogni riga rappresenta una combinazione unica di libro e genere, e la tabella è ora in Prima Forma Normale. Ciò elimina le anomalie di inserimento e aggiornamento precedentemente presenti.
Esempio di Seconda Forma Normale (2NF)
Supponiamo di avere una tabella Ordini
che tiene traccia degli ordini effettuati dai clienti e dei prodotti inclusi in ciascun ordine. Attualmente, la tabella non soddisfa la Seconda Forma Normale (2NF). Ecco come potrebbe apparire la tabella:
Tabella Ordini (Non in 2NF):
Numero_Ordine | Cliente | Prodotto | Quantità | Prezzo_Unitario |
---|---|---|---|---|
1 | Cliente_A | Laptop Dell | 2 | 1000 |
1 | Cliente_A | Mouse Wireless | 1 | 30 |
2 | Cliente_B | Stampante HP | 1 | 150 |
2 | Cliente_B | Tablet Samsung | 3 | 200 |
In questa tabella, abbiamo informazioni relative a prodotti e quantità che sono strettamente dipendenti solo dal Numero_Ordine e non dalla chiave primaria completa (Numero_Ordine, Prodotto). Ciò viola la Seconda Forma Normale.
Anomalie presenti:
- Anomalia di Aggiornamento: Se volessimo modificare il prezzo di un prodotto specifico, dovremmo aggiornare più righe, aumentando il rischio di errori o inconsistenze.
Per renderla in Seconda Forma Normale, dobbiamo separare le informazioni sui prodotti in una tabella a parte, associando ciascun prodotto al suo numero d’ordine:
Tabella Ordini (In 2NF):
Tabella Ordini:
Numero_Ordine | Cliente |
---|---|
1 | Cliente_A |
2 | Cliente_B |
Tabella Dettagli_Ordine:
Numero_Ordine | Prodotto | Quantità | Prezzo_Unitario |
---|---|---|---|
1 | Laptop Dell | 2 | 1000 |
1 | Mouse Wireless | 1 | 30 |
2 | Stampante HP | 1 | 150 |
2 | Tablet Samsung | 3 | 200 |
In questo modo, abbiamo separato le informazioni sui prodotti in una tabella distinta, in cui la chiave primaria è costituita da Numero_Ordine e Prodotto. Ogni riga rappresenta ora una combinazione unica di numero d’ordine e prodotto, soddisfacendo così la Seconda Forma Normale.
Esempio di Terza Forma Normale (3NF)
Supponiamo di avere una tabella Dipendenti
che registra informazioni sui dipendenti di un’azienda, inclusi i dati sul dipartimento in cui lavorano. Attualmente, la tabella non soddisfa la Terza Forma Normale (3NF). Ecco come potrebbe apparire la tabella:
Tabella Dipendenti (Non in 3NF):
ID_Dipendente | Nome | Dipartimento | Luogo_Dipartimento |
---|---|---|---|
1 | Mario Rossi | Vendite | Roma |
2 | Laura Bianchi | Finanza | Milano |
3 | Luigi Verdi | Vendite | Roma |
In questa tabella, Luogo_Dipartimento
dipende solo dalla chiave primaria Dipartimento
, non dalla chiave primaria completa ID_Dipendente
. Ciò viola la Terza Forma Normale.
Anomalie presenti:
- Anomalia di Aggiornamento: Se volessimo modificare il luogo di un dipartimento, dovremmo aggiornare più righe, aumentando il rischio di errori o inconsistenze.
Per renderla in Terza Forma Normale, dobbiamo separare le informazioni relative al dipartimento in una tabella distinta, in modo che Luogo_Dipartimento
dipenda solo dalla chiave primaria Dipartimento
:
Tabella Dipendenti (In 3NF):
Tabella Dipendenti:
ID_Dipendente | Nome | Dipartimento |
---|---|---|
1 | Mario Rossi | Vendite |
2 | Laura Bianchi | Finanza |
3 | Luigi Verdi | Vendite |
Tabella Dipartimenti:
Dipartimento | Luogo_Dipartimento |
---|---|
Vendite | Roma |
Finanza | Milano |
In questo modo, abbiamo separato le informazioni relative al dipartimento in una tabella distinta, in cui la chiave primaria è costituita solo da Dipartimento
. Ora Luogo_Dipartimento
dipende solo dalla chiave primaria della sua tabella, eliminando così la dipendenza transitiva e soddisfacendo la Terza Forma Normale.