Basi di Dati Progettazione e Forme Normali versione 2.0 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina) G. Mecca – [email protected] – Università della Basilicata Progettazione e Forme Normali >> Sommario Sommario Introduzione Una Tabella non in Forma Normale Forma Normale di Boyce-Codd Dipendenza Funzionale Definizione Formale Tecniche per la Verifica di Qualità G. Mecca - [email protected] - Basi di Dati 2 Progettazione e Forme Normali >> Introduzione Introduzione Idealmente se lo schema concettuale è di qualità (corretto, completo e non ridondante) se la progettazione logica è condotta applicando correttamente l’algoritmo la base di dati risultante dovrebbe essere di qualità in particolare: dovrebbe essere in forma “normale” G. Mecca - [email protected] - Basi di Dati 3 Progettazione e Forme Normali >> Introduzione Introduzione In realtà è possibile commettere errori nella fase di analisi e in quella di progettazione logica è necessario effettuare verifiche di qualità continue, per accertarsi che il risultato sia corretto E’ necessario quindi approfondire il concetto di forma normale G. Mecca - [email protected] - Basi di Dati 4 Progettazione e Forme Normali >> Introduzione Introduzione Intuitivamente una base di dati è in forma normale se i concetti sono opportunamente rappresentati nelle tabelle non ci sono ridondanze non si producono anomalie di aggiornamento, di inserimento e di cancellazione G. Mecca - [email protected] - Basi di Dati 5 Progettazione e Forme Normali >> Introduzione Una Tabella Non in Forma Normale studente annoCorso corso voto docente Pinco Palla 1 Programmazione 27 F. Totti Pinco Pietro 2 Programmazione T 1StudentiCorsiEsami Basi di Dati 24 F. Totti 30 C. Vieri Rossi Paolo 2studente CHAR(20) Basi di Dati PK 25 C. Vieri Pinco Palla 1corso CHAR(20) Tecnologie Web PK 27 A. Del Piero INTEGER 1annoCorso Programmazione 21 F. Totti Bruno Pasquale Bruno Pasquale voto INTEGER docente VARCHAR(20) G. Mecca - [email protected] - Basi di Dati 6 Progettazione e Forme Normali >> Introduzione Una Tabella Non in Forma Normale Da dove nascono i problemi errori in fase di modello concettuale La specifica Ogni studente è identificato dal suo nome ed è iscritto ad un anno di corso. Ogni corso è identificato dal suo nome ed ha un docente. Gli studenti sostengono esami per i corsi, riportando voti tra 18 e 30. Ogni studente deve sostenere più esami. G. Mecca - [email protected] - Basi di Dati Lo Schema Concettuale StudentiCorsiEsami <<id>> studente <<id>> corso annoCorso voto docente 7 Progettazione e Forme Normali >> Intoduzione Una Tabella Non in Forma Normale Uno schema più corretto Studente Corso sostiene esame di > <<id>> nome annoCorso 0..* <<id>> nome 0..* docente voto G. Mecca - [email protected] - Basi di Dati 8 Progettazione e Forme Normali >> Introduzione Una Tabella Non in Forma Corso Normale nome CHAR(20) base di dati risultante Studente T nome CHAR(20) PK annoCorso INTEGER nome annoCorso PK docentedocente VARCHAR(20) nome La Programmazione F. Totti Basi di Dati C. Vieri Tecnologie Web A. Del Piero studente esame voto Pinco Palla Programmazione 27 Pinco Palla 1 Pinco Pietro Programmazione 24 Pinco Pietro 2 Bruno Pasquale Basi di Dati 30 Bruno Pasquale 1 Rossi Paolo Rossi Paolo 2 Pinco Palla Basi di Dati Esami Tecnologie Web 25 27T studente CHAR(20) Bruno Pasquale Programmazione corso CHAR(20) G. Mecca - [email protected] - Basi di Dati T voto INTEGER 21PK, FK PK, FK 9 Progettazione e Forme Normali >> Introduzione Una Tabella Non in Forma Normale Intuitivamente l’errore nasce dalla scelta del modello concettuale una classe che descrive più di un concetto in generale, invece, ogni classe dovrebbe descrivere un unico concetto Attenzione l’errore potrebbe non essere percepibile guardando il modello concettuale G. Mecca - [email protected] - Basi di Dati 10 Progettazione e Forme Normali >> Introduzione Una Tabella Non in Forma Normale Per evitare questi problemi è necessario effettuare verifiche ripetute sui risultati della progettazione logica ed, in caso di errori, correggere lo schema concettuale Oggetto delle verifiche che le tabelle prodotte rispettino una “forma normale” G. Mecca - [email protected] - Basi di Dati 11 Progettazione e Forme Normali >> Forma Normale Forma Normale Vincolo sulla struttura di una base di dati garantisce che non si generano anomalie Discuteremo la F. N. di Boyce-Codd è quella più forte normalmente ottenibile (tranne casi strani) Terza Forma Normale è più debole di quella di Boyce-Codd è sempre ottenibile (ma non ne parleremo) G. Mecca - [email protected] - Basi di Dati 12 Progettazione e Forme Normali >> Forma Normale Forma Normale Forma Normale di Boyce-Codd (FNBC) vincolo sull’organizzazione delle tabelle della base di dati una tabella che rispetta il vincolo si dice “normalizzata” altrimenti si dice “non normalizzata” Approccio daremo prima l’intuizione, poi la formalizzazione G. Mecca - [email protected] - Basi di Dati 13 Progettazione e Forme Normali >> Forma Normale Forma Normale Intuizione R si dice in FNBC se non esiste nessuna “sottotabella” con una “chiave propria” Sottotabella qualsiasi proiezione di R Sottotabella con chiave propria proiezione per cui è possibile trovare una chiave primaria non banale che non è chiave per R G. Mecca - [email protected] - Basi di Dati 14 Progettazione e Forme Normali >> Forma Normale Forma Normale Nel nostro esempio: esistono varie sottotabelle con chiavi proprie StudentiCorsiEsami T studente CHAR(20) PK corso CHAR(20) PK Studenti = p studente, annoCorso (StudentiCorsiEsami) Studenti T annoCorso INTEGER voto INTEGER docente VARCHAR(20) studente CHAR(20) annoCorso INTEGER la specifica mi dice che “studente” è una chiave per la tabella G. Mecca - [email protected] - Basi di Dati 15 Progettazione e Forme Normali >> Forma Normale Forma Normale In modo simile: Corsi = StudentiCorsiEsami T studente CHAR(20) PK corso CHAR(20) PK p corso, docente (StudentiEsamiCorsi) annoCorso INTEGER voto INTEGER Corsi T corso CHAR(20) docente VARCHAR(20) docente VARCHAR(20) la specifica mi dice che “corso” è una chiave per la tabella G. Mecca - [email protected] - Basi di Dati 16 Progettazione e Forme Normali >> Forma Normale Forma Normale Viceversa, in questa tabella non esistono sottotabelle con chiavi proprie Esami T studente CHAR(20) PK corso CHAR(20) PK NON ci sono chiavi proprie voto INTEGER Esempio = p studente, voto (Esami) G. Mecca - [email protected] - Basi di Dati Esempio T studente CHAR(20) voto INTEGER 17 Progettazione e Forme Normali >> Forma Normale Forma Normale Infatti, guardando l’istanza non esiste nessuna chiave (vedi specifica) Esempio T studente CHAR(20) voto INTEGER lo stesso discorso vale per tutte le altre possibili proiezioni G. Mecca - [email protected] - Basi di Dati studente voto Pinco Palla 27 Pinco Pietro 24 Bruno Pasquale 30 Rossi Paolo 25 Pinco Palla 27 Bruno Pasquale 21 18 Progettazione e Forme Normali >> Forma Normale Forma Normale Un altro esempio DocenteNumero T codice CHAR(4) cognome CHAR(20) Docente T nome CHAR(20) codice CHAR(4) PK facolta CHAR(10) cognome CHAR(20) qualifica CHAR(15) nome CHAR(20) tipo CHAR(10) facolta CHAR(10) numero CHAR(15) PK qualifica CHAR(15) tipo CHAR(10) questa tabella è normalizzata questa tabella non è normalizzata Es = p codice, cognome (DocenteNumero) “codice” è una chiave propria G. Mecca - [email protected] - Basi di Dati 19 Progettazione e Forme Normali >> Forma Normale Forma Normale Per formalizzare abbiamo bisogno di una nozione ulteriore Concetto di Dipendenza Funzionale vincolo di integrità aggiuntivo sulle tabelle è una generalizzazione del vincolo di chiave In sostanza serve a dire che valori uguali di un attributo in una tabella implicano valori uguali di altri attributi G. Mecca - [email protected] - Basi di Dati 20 Progettazione e Forme Normali >> Forma Normale >> Dip. Funzionale Dipendenza Funzionale Sintassi data una tabella R con attributi A, B, C, D, ... A, B, ... → C, D, ... Semantica la tabella R è tale per cui ennuple che hanno valori uguali per gli attributi A, B, ... hanno necessariamente valori uguali per gli attributi C, D, ... G. Mecca - [email protected] - Basi di Dati 21 Progettazione e Forme Normali >> Forma Normale >> Dip. Funzionale Dipendenza Funzionale Esempi studente → annoCorso corso → docente studente, corso → voto, annoCorso, docente studente annoCorso corso voto docente Pinco Palla 1 Programmazione 27 F. Totti Pinco Pietro 2 Programmazione 24 F. Totti Bruno Pasquale 1 Basi di Dati 30 C. Vieri Rossi Paolo 2 Basi di Dati 25 C. Vieri Pinco Palla 1 Tecnologie Web 27 A. Del Piero Bruno Pasquale 1 Programmazione 21 F. Totti G. Mecca - [email protected] - Basi di Dati 22 Progettazione e Forme Normali >> Forma Normale Dipendenza Funzionale In effetti il vincolo di chiave è un caso particolare di dipendenza funzionale gli attributi della chiave implicano tutti gli altri studente, corso → voto, annoCorso, docente Nota per definizione, vale anche: studente, corso → studente, corso, voto, annoCorso, docente G. Mecca - [email protected] - Basi di Dati 23 Progettazione e Forme Normali >> Forma Normale Dipendenza Funzionale Dipendenze non banali non ci sono attributi che compaiono sia a destra che a sinistra ogni dipendenza è riducibile alla forma non banale eliminando dalla parte destra gli attributi che compaiono a sinistra In generale una tabella ha varie dipendenze funzionali non banali (e moltissime banali) G. Mecca - [email protected] - Basi di Dati 24 Progettazione e Forme Normali >> Forma Normale >> Def. Formale Definizione Formale Forma Normale di Boyce-Codd una tabella R è in FNBC se, per ogni dipendenza funzionale non banale su R, il membro sinistro è una chiave per R Intuizione se ci fosse una dipendenza A, B → C, D e A B non sono chiavi per R, la proiezione di R su A, B, C, D sarebbe una sottotabella con chiave propria G. Mecca - [email protected] - Basi di Dati 25 Progettazione e Forme Normali >> Forma Normale >> Def. Formale Definizione Formale Esempi: tabella non normalizzata StudentiEsamiCorsi T studente CHAR(20) PK corso CHAR(20) PK annoCorso INTEGER voto INTEGER docente VARCHAR(20) studente → annoCorso (suggerisce la sottotabella corrispondente alla proiezione su studente e annoCorso) corso → docente (suggerisce la sottotabella corrispondente alla proiezione su corso e docente) G. Mecca - [email protected] - Basi di Dati 26 Progettazione e Forme Normali >> Forma Normale >> Def. Formale Definizione Formale Esempi: tabella non normalizzata DocenteNumero T codice CHAR(4) codice → cognome, nome, facoltà, qualifica, tipo cognome CHAR(20) nome CHAR(20) facolta CHAR(10) qualifica CHAR(15) tipo CHAR(10) numero CHAR(15) PK G. Mecca - [email protected] - Basi di Dati (suggerisce una qualsiasi sottotabella fatta da codice ed uno degli attributi – anche tutti – della parte sinistra) 27 Progettazione e Forme Normali >> Tecniche di Verifica Tecniche di Verifica In concreto scoprire l’errore dopo aver creato la base di dati sarebbe grave è opportuno verificare continuamente i risultati della progettazione per accorgersi tempestivamente degli errori Idealmente verifica sullo schema concettuale (se lo schema è corretto, tabelle normalizzate) G. Mecca - [email protected] - Basi di Dati 28 Progettazione e Forme Normali >> Tecniche di Verifica Tecniche di Verifica Quindi, il metodo suggerito è attenzione alla creazione dello schema concettuale verifica della correttezza delle classi rispetto ai concetti verifica a posteriori sulle tabelle derivate dalla progettazione logica utilizzando le dipendenze funzionali G. Mecca - [email protected] - Basi di Dati 29 Progettazione e Forme Normali >> Tecniche di Verifica Tecniche di Verifica In generale ogni classe deve rappresentare un concetto Errori frequenti nello schema logico una classe traduce due o più concetti in relazione molti-a-molti una classe traduce due o più concetti in relazione uno-a-molti una classe traduce in modo scorretto un attributo multivalore G. Mecca - [email protected] - Basi di Dati 30 Progettazione e Forme Normali >> Tecniche di Verifica Tecniche di Verifica Esempio: molti a molti StudentiEsamiCorsi <<id>> studente <<id>> corso annoCorso voto docente Studente Corso sostiene esame di > <<id>> nome annoCorso 0..* <<id>> nome 0..* docente voto G. Mecca - [email protected] - Basi di Dati 31 Progettazione e Forme Normali >> Tecniche di Verifica Tecniche di Verifica StudenteEsame <<id>> matricola Esempio: 1 a molti cognome nome annoDicorso voto lode <<id> data Studente <<id>> matricola cognome Esame 1 ha sostenuto > nome 0..* voto lode data annoDiCorso G. Mecca - [email protected] - Basi di Dati 32 Progettazione e Forme Normali >> Tecniche di Verifica Tecniche di Verifica Esempio: attributo multivalore DocenteNumeri cognome nome qualifica numTelefono <<id>> Docente cognome nome qualifica numTelefono [0..*] G. Mecca - [email protected] - Basi di Dati 33 Progettazione e Forme Normali >> Tecniche di Verifica Tecniche di Verifica Attenzione bisogna però evitare l’errore opposto, ovvero quello di separare eccessivamente i concetti Esame Votazione 0..n data ha riportato > 1 voto lode in questo caso, risalire ai voti costringe a fare join non necessari G. Mecca - [email protected] - Basi di Dati 34 Progettazione e Forme Normali >> Tecniche di Verifica Tecniche di Verifica Concludendo è necessario trovare il giusto compromesso nella scelta delle classi In particolare una classe deve tradurre un concetto ben identificabile (non accorpare troppo) non bisogna creare classi che rappresentano concetti irrilevanti (non separare troppo) G. Mecca - [email protected] - Basi di Dati 35 Progettazione e Forme Normali >> Tecniche di Verifica Tecniche di Verifica Successivamente in fase di progettazione fisica e messa a punto “tuning” è possibile ritornare su queste decisioni in alcuni casi, per motivi di prestazioni, è possibile tollerare tabelle non normalizzate ma questa è una scelta che va fatta successivamente G. Mecca - [email protected] - Basi di Dati 36 Progettazione e Forme Normali >> Sommario Sommario Introduzione Una Tabella non in Forma Normale Forma Normale di Boyce-Codd Dipendenza Funzionale Definizione Formale Tecniche per la Verifica di Qualità G. Mecca - [email protected] - Basi di Dati 37 Progettazione e Forme Normali >> Modello Concettuale Corso Esame < relativo a <<id>> codice 0..* voto 1 titolo 0..* relatore solo se al 3 anno ciclo titolarità data 1 Docente lode ha sostenuto > Studente cognome relatore > nome <<id>> matricola cognome 0..* qualifica 0..1 0..* numTelefono [0..*] 0..* Tirocinio sede 1 dataInizio nome durata annoDiCorso ha svolto > DocenteInterno Supplente facolta Schema Concettuale G. Mecca - [email protected] - Basi di Dati Studente Laurea Triennale 0..* 0..1 Studente Laurea Specialistica tutor > 0..1 38 Progettazione Logica >> Algoritmo di Traduzione Titolarità T Corso T corso CHAR(3) PK, FK codice CHAR(3) PK docente CHAR(4) PK, FK titolo CHAR(20) codice CHAR(5) PK ciclo CHAR(20) voto INTEGER Tirocinio T studente INTEGER PK, FK sede CHAR(20) Docente T codice CHAR(4) PK cognome CHAR(20) dataInizio DATE Esame T lode BOOL data DATE corso CHAR(3) FK stud INTEGER FK nome CHAR(20) durata INTEGER Studente T matricola INTEGER PK facolta CHAR(10) Numeri T qualifica CHAR(15) numero CHAR(15) PK tipo CHAR(10) docente CHAR(4) FK cognome CHAR(20) nome CHAR(20) Tutorato T ciclo CHAR(15) studente INTEGER PK, FK anno INTEGER tutor INTEGER PK, FK relatoreG.CHAR(4) FK Mecca - [email protected] - Basi di Dati 39 Termini della Licenza Termini della Licenza This work is licensed under the Creative Commons AttributionShareAlike License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/1.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. Questo lavoro viene concesso in uso secondo i termini della licenza “Attribution-ShareAlike” di Creative Commons. Per ottenere una copia della licenza, è possibile visitare http://creativecommons.org/licenses/by-sa/1.0/ oppure inviare una lettera all’indirizzo Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. G. Mecca - [email protected] - Basi di Dati 40