Esempio di normalizzazione Lezione per la classe VAL novembre 2009
Problema da risolvere: memorizzazione di fatture
Metodo di soluzione Iniziare con una lista dei campi che devono apparire nel database Pensa a questi campi come se appartenessero ad un’unica tabella Non includere i campi derivati (calcolati) Otteniamo questa informazione dalla stampa di un documento del quale si vogliono memorizzare i dati.
La lista dei campi del nostro esempio: fatture SalesOrderNo , Date, CustomerNo, CustomerName, CustomerAdd, ClerkNo, ClerkName,  ItemNo , Description, Qty, UnitPrice
Prima forma normale Separa dalla tabella principale i gruppi di campi che si ripetono (altrimenti avremmo delle celle della tabella con più valori) Crea una nuova tabella con questi gruppi di campi La chiave primaria della nuova tabella è sempre una chiave composta: di solito tra il numero del documento e un campo che identifica univocamente la linea che si ripete, come item number
Prima forma normale del nostro esempio La nuova tabella è: ORDINE( SalesOrderNo ,  ItemNo , Description, Qty, UnitPrice) I campi che si ripetono sono rimossi dalla tabella principale che si riduce a: FATTURA( SalesOrderNo , Date, CustomerNo, CustomerName, CustomerAdd, ClerkNo, ClerkName) abbiamo normalizzato nella 1nf
Seconda forma normale Occorre rimuovere le dipendenze parziali Dipendenza funzionale   il valore di un attributo di una tabella è determinato univocamente dal valore di un altro attributo. Dipendenza parziale   è una dipendenza funzionale dove un attributo dipende solo da una parte di una chiave primaria (la chiave primaria deve essere composta) Crea delle tabelle separate con i dati funzionalmente dipendenti ed i loro determinanti
Seconda forma normale nel nostro esempio Nella tabella ORDINE( SalesOrderNo ,  ItemNo , Description, Qty, UnitPrice) c’è la dipendenza parziale  ItemNo , Description Tutti questi campi ad eccezione della chiave primaria saranno rimossi dalla tabella originale. La chiave primaria è lasciata come chiave esterna per collegare le tabelle. Pertanto la tabella ORDINE si spezza in ITEM( ItemNo , Description) e ORDINE( SalesOrderNo ,  ItemNo , Qty, UnitPrice)
Terza forma normale Rimuove le dipendenze transitive Dipendenza transitiva   è un tipo di dipendenza funzionale, laddove un attributo dipende da un altro attributo che non è, né fa parte della chiave primaria. Pertanto il suo valore è solo indirettamente determinato dalla chiave primaria Crea una tabella separata per questa dipendenza funzionale. Lascia una copia del determinante nella tabella originale come chiave esterna
Terza forma normale per il nostro esempio FATTURA( SalesOrderNo , Date, CustomerNo, CustomerName, CustomerAdd, ClerkNo, ClerkName) Abbiamo due dipendenze funzionali: CustomerNo  CustomerName, CustomerAdd ClerkNo  ClerkName I loro determinanti CustomerNo e ClerkNo non fanno parte della chiave primaria, nè sono chiave Creiamo le due nuove tabelle CLIENTE( CustomerNo , CustomerName, CustomerAdd) IMPIEGATO( ClerkNo , ClerkName) Tutti questi campi ad eccezione delle loro chiavi primarie sono rimossi dalla tabella FATTURA: FATTURA( SalesOrderNo , Date, CustomerNo, ClerkNo)
LE TABELLE NORMALIZZATE FATTURA( SalesOrderNo , Date, CustomerNo, ClerkNo) ORDINE( SalesOrderNo ,  ItemNo , Qty, UnitPrice) ITEM( ItemNo , Description) CLIENTE( CustomerNo , CustomerName, CustomerAdd) IMPIEGATO( ClerkNo , ClerkName)
LO SCHEMA CONCETTUALE

Esempio Di Normalizzazione

  • 1.
    Esempio di normalizzazioneLezione per la classe VAL novembre 2009
  • 2.
    Problema da risolvere:memorizzazione di fatture
  • 3.
    Metodo di soluzioneIniziare con una lista dei campi che devono apparire nel database Pensa a questi campi come se appartenessero ad un’unica tabella Non includere i campi derivati (calcolati) Otteniamo questa informazione dalla stampa di un documento del quale si vogliono memorizzare i dati.
  • 4.
    La lista deicampi del nostro esempio: fatture SalesOrderNo , Date, CustomerNo, CustomerName, CustomerAdd, ClerkNo, ClerkName, ItemNo , Description, Qty, UnitPrice
  • 5.
    Prima forma normaleSepara dalla tabella principale i gruppi di campi che si ripetono (altrimenti avremmo delle celle della tabella con più valori) Crea una nuova tabella con questi gruppi di campi La chiave primaria della nuova tabella è sempre una chiave composta: di solito tra il numero del documento e un campo che identifica univocamente la linea che si ripete, come item number
  • 6.
    Prima forma normaledel nostro esempio La nuova tabella è: ORDINE( SalesOrderNo , ItemNo , Description, Qty, UnitPrice) I campi che si ripetono sono rimossi dalla tabella principale che si riduce a: FATTURA( SalesOrderNo , Date, CustomerNo, CustomerName, CustomerAdd, ClerkNo, ClerkName) abbiamo normalizzato nella 1nf
  • 7.
    Seconda forma normaleOccorre rimuovere le dipendenze parziali Dipendenza funzionale  il valore di un attributo di una tabella è determinato univocamente dal valore di un altro attributo. Dipendenza parziale  è una dipendenza funzionale dove un attributo dipende solo da una parte di una chiave primaria (la chiave primaria deve essere composta) Crea delle tabelle separate con i dati funzionalmente dipendenti ed i loro determinanti
  • 8.
    Seconda forma normalenel nostro esempio Nella tabella ORDINE( SalesOrderNo , ItemNo , Description, Qty, UnitPrice) c’è la dipendenza parziale ItemNo , Description Tutti questi campi ad eccezione della chiave primaria saranno rimossi dalla tabella originale. La chiave primaria è lasciata come chiave esterna per collegare le tabelle. Pertanto la tabella ORDINE si spezza in ITEM( ItemNo , Description) e ORDINE( SalesOrderNo , ItemNo , Qty, UnitPrice)
  • 9.
    Terza forma normaleRimuove le dipendenze transitive Dipendenza transitiva  è un tipo di dipendenza funzionale, laddove un attributo dipende da un altro attributo che non è, né fa parte della chiave primaria. Pertanto il suo valore è solo indirettamente determinato dalla chiave primaria Crea una tabella separata per questa dipendenza funzionale. Lascia una copia del determinante nella tabella originale come chiave esterna
  • 10.
    Terza forma normaleper il nostro esempio FATTURA( SalesOrderNo , Date, CustomerNo, CustomerName, CustomerAdd, ClerkNo, ClerkName) Abbiamo due dipendenze funzionali: CustomerNo  CustomerName, CustomerAdd ClerkNo  ClerkName I loro determinanti CustomerNo e ClerkNo non fanno parte della chiave primaria, nè sono chiave Creiamo le due nuove tabelle CLIENTE( CustomerNo , CustomerName, CustomerAdd) IMPIEGATO( ClerkNo , ClerkName) Tutti questi campi ad eccezione delle loro chiavi primarie sono rimossi dalla tabella FATTURA: FATTURA( SalesOrderNo , Date, CustomerNo, ClerkNo)
  • 11.
    LE TABELLE NORMALIZZATEFATTURA( SalesOrderNo , Date, CustomerNo, ClerkNo) ORDINE( SalesOrderNo , ItemNo , Qty, UnitPrice) ITEM( ItemNo , Description) CLIENTE( CustomerNo , CustomerName, CustomerAdd) IMPIEGATO( ClerkNo , ClerkName)
  • 12.