Third normal form (3NF) è un principio di database che supporta l'integrità dei dati basandosi sui principi di normalizzazione del database forniti da First Normal Form (1NF) e Second Normal Form (2NF).
Terza Normale Requisiti Formali
Esistono due requisiti di base per un database in terza forma normale:
- Il database deve già soddisfare i requisiti di 1NF e 2NF.
- Tutte le colonne del database devono dipendere dalla chiave primaria, il che significa che il valore di qualsiasi colonna può essere derivato solo dalla chiave primaria.
Informazioni sulla dipendenza dalla chiave primaria
Esploriamo ulteriormente cosa intendiamo per il fatto che tutte le colonne devono dipendere dalla chiave primaria.
Se il valore di una colonna può essere derivato sia dalla chiave primaria che da un'altra colonna nella tabella, viola 3NF. Considera una tabella Impiegati con queste colonne:
- Numero Identità dell'impiegato
- Nome di battesimo
- Cognome
Sia LastName che FirstName dipendono solo dal valore di EmployeeID? Bene, LastName potrebbe dipendere da FirstName? No, perché nulla di inerente a LastName suggerisce il valore di FirstName. Potrebbe FirstName dipendere da LastName? No, ancora una volta, perché lo stesso è vero: qualunque cosa un LastName potrebbe essere, non potrebbe fornire un suggerimento sul valore di FirstName. Pertanto, questa tabella è conforme a 3NF.
Ma considera questa tabella dei veicoli:
- VehicleID
- fabbricante
- Modello
Il Produttore e il Modello potrebbero derivare dal VehicleID - ma il Modello potrebbe anche derivare dal Costruttore perché un modello di veicolo è realizzato solo da un particolare produttore. Questo modello di tabella non è conforme a 3NF e potrebbe pertanto causare anomalie nei dati. Ad esempio, è possibile aggiornare il produttore senza aggiornare il modello, introducendo inesattezze.
Per renderlo conforme, avremmo bisogno di spostare la colonna dipendente supplementare su un'altra tabella e farne riferimento usando una chiave esterna. Ciò comporterebbe due tabelle:
Tabella dei veicoli
Nella tabella seguente, ModelID è una chiave esterna per Modelli tavolo:
- VehicleID
- fabbricante
- ModelID
Tabella dei modelli
Questa nuova tabella mappa i modelli per i produttori. Se desideri aggiornare le informazioni sul veicolo specifiche di un modello, lo farai in questa tabella, piuttosto che nella tabella Veicoli.
- ModelID
- fabbricante
- Modello
Campi derivati nel modello 3NF
Una tabella potrebbe contenere un campo derivato, uno calcolato in base ad altre colonne nella tabella. Ad esempio, considera questa tabella di ordini di widget:
- Numero d'ordine
- Numero cliente
- Prezzo unitario
- Quantità
- Totale
Il totale interrompe la conformità 3NF perché può essere derivato moltiplicando il prezzo unitario per la quantità, anziché essere completamente dipendente dalla chiave primaria. Dobbiamo rimuoverlo dal tavolo per rispettare la terza forma normale.
Infatti, poiché è derivato, è meglio non memorizzarlo nel database.
Possiamo semplicemente calcolarlo "al volo" quando eseguiamo query di database. Ad esempio, potremmo aver precedentemente utilizzato questa query per recuperare numeri e totali dell'ordine:
SELECT OrderNumber, Total FROM WidgetOrders
Ora possiamo usare la seguente query:
SELECT OrderNumber, UnitPrice * Quantity AS Total FROM WidgetOrders
per ottenere gli stessi risultati senza violare le regole di normalizzazione.