· 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.

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_StudenteNome_StudenteCorso1Corso2Corso3
1MarioMatematicaFisicaInformatica
2LauraStoriaNULLNULL

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_StudenteNome_StudenteCorso1Corso2Corso3
1MarioStoriaFisicaInformatica
2LauraStoriaNULLNULL

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_LibroTitoloAutoreGeneri
1”Il Signore degli Anelli”J.R.R. TolkienFantasia, Avventura
2”1984”George OrwellDistopia, Politica
3”Harry Potter”J.K. RowlingFantasy, 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:

  1. 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.

  2. 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_LibroTitoloAutoreGenere
1”Il Signore degli Anelli”J.R.R. TolkienFantasia
1”Il Signore degli Anelli”J.R.R. TolkienAvventura
2”1984”George OrwellDistopia
2”1984”George OrwellPolitica
3”Harry Potter”J.K. RowlingFantasy
3”Harry Potter”J.K. RowlingMagia

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_OrdineClienteProdottoQuantitàPrezzo_Unitario
1Cliente_ALaptop Dell21000
1Cliente_AMouse Wireless130
2Cliente_BStampante HP1150
2Cliente_BTablet Samsung3200

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:

  1. 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_OrdineCliente
1Cliente_A
2Cliente_B

Tabella Dettagli_Ordine:

Numero_OrdineProdottoQuantitàPrezzo_Unitario
1Laptop Dell21000
1Mouse Wireless130
2Stampante HP1150
2Tablet Samsung3200

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_DipendenteNomeDipartimentoLuogo_Dipartimento
1Mario RossiVenditeRoma
2Laura BianchiFinanzaMilano
3Luigi VerdiVenditeRoma

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:

  1. 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_DipendenteNomeDipartimento
1Mario RossiVendite
2Laura BianchiFinanza
3Luigi VerdiVendite

Tabella Dipartimenti:

DipartimentoLuogo_Dipartimento
VenditeRoma
FinanzaMilano

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.

Back to Blog

Related Posts

View All Posts »
Python e PostgreSQL: gestione di database

Python e PostgreSQL: gestione di database

Scopri come utilizzare Python per interagire con un database PostgreSQL, un sistema di gestione di database open source ampiamente utilizzato per la sua affidabilità e flessibilità.

Creazione e gestione degli indici nei database SQL

Creazione e gestione degli indici nei database SQL

Gli indici SQL sono strumenti potenti per ottimizzare le prestazioni dei database relazionali. Con una comprensione approfondita dei concetti chiave, delle tecniche di creazione e gestione, e dei benefici e delle considerazioni, gli studenti e i professionisti del database possono sfruttare al meglio gli indici per garantire prestazioni efficienti e scalabili per le loro applicazioni.

Definizione di base di dati

Definizione di base di dati

Una base di dati è una raccolta di dati strutturati, organizzati in modo da consentire l'archiviazione, la gestione, la ricerca, l'aggiornamento e la manipolazione efficiente delle informazioni e progettati per essere usati in applicazioni differenti e da differenti utenti.

Quali sono le differenze tra "INNER JOIN" e "OUTER JOIN"

Quali sono le differenze tra "INNER JOIN" e "OUTER JOIN"

La differenza tra INNER JOIN e OUTER JOIN è uno dei concetti fondamentali della progettazione di database relazionali. In questo articolo, esaminiamo le differenze tra INNER JOIN e OUTER JOIN e quando è opportuno utilizzare ciascuno di essi.

Definzione di DBMS

Definzione di DBMS

Esistono diversi tipi di basi di dati, a seconda della loro struttura, della tecnologia utilizzata e del modello di dati utilizzato.