Teoria della Normalizzazione Obiettivo Sviluppare una metodologia che
Teoria della Normalizzazione
Obiettivo — Sviluppare una metodologia che permetta di: n Decidere se un particolare schema di relazione è un buon schema n Nel caso che uno schema di relazione R non soddisfi i criteri di bontà, decomporlo in un insieme di schemi di relazione {R 1, R 2, . . . , Rn} tali che • ogni Ri sia un buon schema • la decomposizione sia senza perdite n Il nostro approccio è basato su: • dipendenze funzionali • dipendenze multivalore
Dipendenze funzionali n Vincoli sulla ammissibilità delle istanza delle relazioni n Stabiliscono che i valori di alcuni attributi determinino i valori di altri attributi n Generalizzazione del concetto di chiave
Dipendenze funzionali (cont. ) n Sia R uno schema di relazione sull’insieme X di attributi, siano inoltre X n Vale la dipendenza funzionale su R se e solo se per ogni istanza di r di R, ogni coppia di ennuple t 1 and t 2 di r aventi gli stessi valori per gli attributi in , ha gli stessi valori per gli attributi in . Più formalmente: t 1[ ] = t 2 [ ] n Esempio: Considerando la seguente istanza r dello schema R(A, B) 3 4 1 5 3 7 n si osserva che: A B NON vale, mentre B A vale.
Ricordiamo che: n K è una superchiave per uno schema R(X) se e solo se K X n K è chiave candidata per R(X) se e solo se • K X, e • per nessun K si ha X n le dipendenze funzionali permettono di esprimere vincoli non esprimibili tramite la nozione di chiave. Consideriamo lo schema: Vendita (nome. Cliente, codice. Merce, nome. Produttore, ammontare). desideriamo che valgano le seguenti dipendenze: codice. Merce ammontare codice. Merce nome. Produttore ma non desideriamo che valga: codice. Merce nome. Cliente
Dipendenze funzionali n Una dipendenza funzionale è banale se è sempre soddisfatta da ogni possibile istanza di una relazione. n In generale, è banale se vale
Chiusura di un insieme di dipendenze funzionali n Dato un insieme F di dipendenze funzionali, vi possono essere altre dipendenze funzionali logicamente implicate da F. • Ad esempio, se A B e B C, possiamo inferire che A C n L’insieme F+ di tutte le dipendenze funzionali logicamente implicate da F è detto chiusura di F. n Possiamo trovare tutti gli elementi di F+ applicando gli assiomi di Armstrong (dove , e sono insiemi di attributi): • se , allora (riflessività) • se , allora (arricchimento) • se , allora (transitività) n Proprietà: queste regole di inferenza sono • corrette (generano solo dipendenze valide) e • complete (generano tutte le dipendenze valide)
Esempio n R = (A, B, C, G, H, I) F = { A B, A C, CG H, CG I, B H} n alcuni membri di F+ sono: • A H § per transitività da A B e B H • AG I § arricchendo A C con G, per ottenere AG CG e poi utilizzando la transitività con CG I • CG HI § da CG H e CG I : questa è una applicazione della union rule, questa regola può essere giustificata in base a: – la definizione di dipendenza funzionale, oppure sfruttando – arricchimento di CG I per ottenere CG CGI, arricchimento di CG H per ottenere CGI HI, e infine transitività
Calcolo di F+ n Algoritmo di calcolo della chiusura di un insieme di dipendenze funzionali F: F+ = F repeat for each dipendenza funzionale f in F+ applica riflessività e arricchimento a f e aggiungi ad F+ le dipendenze ottenute for each coppia di dipendenze f 1 e f 2 in F+ if f 1 e f 2 possono essere combinate utilizzando la transitività then aggiungi ad F+ le dip. ottenute until F+ non cambia NOTA: vedremo un algoritmo migliore
Calcolo di F+ n Possiamo velocizzare/semplificare il calcolo di F+ utilizzando ulteriori regole di inferenza: § Se valgono e , allora vale anche (unione) § Se vale , allora valgono anche e (decomposizione) § Se valgono e , allora vale anche (pseudotransitività) Esercizio: Ricavare le precedenti regole a partire dagli assiomi di Armstrong.
Chiusura di un insieme di attributi n Dato un insieme di attributi , si definisce la chiusura di rispetto a F (denotata con +) l’insieme di tutti gli attributi che sono funzionalmente determinati da attributi in utilizzando le dipendenza in F. n Avremo che: è in F+ se e solo se + n Algoritmo che computa + rispetto a F: result : = ; while (ci sono cambiamenti in result) do for each in F do begin if result then result : = result end
Esempio n R(X) = (A, B, C, G, H, I) (quindi X = ABCGHI ) n F = {A B, A C, CG H, CG I, B H} n (AG)+ 1. result = AG 2. result = ABCG (da A C e A B) 3. result = ABCGH (da CG H e CG AGBC) 4. result = ABCGHI (da CG I e CG AGBCH) n Domanda: AG è una chiave candidata? 1. AG è una superchiave? 1. vale AG X ? ovvero vale (AG)+ X ? H Esiste un sottoinsieme proprio di AG che sia superchiave? H vale A X ? ovvero vale (A)+ X ? H vale G X ? ovvero vale (G)+ X ?
Chiusura di attibuti Viene sfruttata in diversi contesti: n verificare se un insieme di attributi è una superchiave: § per verificare se è superchiave si calcola +. è superchiave se + contiene tutti gli attributi di R(X). n verificare se vale una dipendenza funzionale § per verificare se vale (ovvero se appartiene a F+) basta verificare se vale +. § cioè, si calcola +, e si verifica se contiene tutti gli attributi di . n calcolo della chiusura di F § per ogni X, si calcola la chiusura +, e per ogni Y +, generiamo la dipendenza Y.
Copertura canonica n Un insieme F di dipendenze funzionali può contenere dipendenze ridondanti, ovvero che possono essere ottenute dalle altre dipendenze di F Ø Esempio: A C è ridondante in {A B, B C, A C} Ø Anche degli attributi di una dipendenza funzionale potrebbero essere ridondanti: § RHS: {A B, B C, A CD} può essere semplificata in {A B, B C, A D} § LHS: {A B, B C, AC D} può essere semplificata in {A B, B C, A D} n Intuitivamente, una copertura canonica di F è un insieme “minimale” di dipendenze funzionali equivalente a F e privo di dipendenze e attributi ridondanti
Attributi estranei n Consideriamo un insieme F di dipendenze funzionali e la dipendenza in F. § Un attributo A è estraneo in se A e F implica logicamente l’insieme di dipendenze (F – { }) {( – A) }. § Un attributo A è estraneo in se A l’insieme di dipendenze (F – { }) { ( – A)} implica logicamente F. Nota: in entrambi i casi sopra riportati, le implicazioni opposte sono banalmente vere n Esempio: dato F = {A C, AB C } § B è estraneo in AB C perché l’insieme {A C, AB C} implica logicamente A C n Esempio: dato F = {A C, AB CD} § C estraneo in AB CD dato che AB C può essere inferita a partire dalle altre dipendenze
Verificare se un attributo è estraneo n Consideriamo un insieme F di dipendenze e una dipendenza funzionale in F. n per verificare se A è estraneo in 1. calcoliamo la chiusura ({ } – A)+ rispetto a F 2. verifichiamo se ({ } – A)+ contiene A; se sì, A è estraneo n per verificare se A è estraneo in 1. calcoliamo la chiusura + rispetto alle sole dipendenze in F’ = (F – { }) { ( – A)}, 2. verifichiamo se + contiene A; se sì, A è estraneo
Copertura canonica n Una copertura canonica di F è un insieme di dipendenze funzionali Fc tale che: § F implica logicamente tutte le dipendenze in Fc, e § Fc implica logicamente tutte le dipendenze in F, e § nessuna dipendenza di Fc contiene attributi estranei, e § tutte le parti sinistre delle dipendenze fuzionali sono uniche in Fc. n Calcolo di una copertura canonica di F: repeat usare la regola unione per rimpiazzare le dipendenze di F 1 1 e 1 1 con 1 1 2 ; cercare una dipendenza con un attributo estraneo in , se tale attributo esiste cancellarlo da until F non cambia n Nota: la regola unione può diventare applicabile a seguito della cancellazione di un attributo estraneo
Esempio n R = (A, B, C) F = {A BC, B C, A B, AB C} n Combiniamo A BC e A B ottenendo A BC Ø Ora F è diventato {A BC, B C, AB C} n A è estraneo in AB C ? Ø verifichiamo se la dipendenza funzionale risultante dalla cancellazione di A da AB C è implicata dalle altre dipendenze 4 Sì: infatti B C è già presente in F Ø Ora F è diventato {A BC, B C} n C è estraneo in A BC Ø verifichiamo se A C è implicata logicamente da A B e dall’altra dipendenza B C 4 Sì: usando la transitività su A B e B C. (lo stesso si poteva dire usando la chiusura degli attributi) n Una copertura canonica è: { A B, B C }
Normalizzare sfruttando le dipendenze funzionali n Decomponendo uno schema di relazione R sfruttando un insieme di dipendenze funzionali F in un insieme di schemi R 1, R 2, . . , Rn vogliamo: H Decomposizione Lossless-join (senza perdite) H Minimizzare la ridondanza: le relazioni Ri dovrebbero essere o in Boyce -Codd Normal Form o in Third Normal Form. H Conservare le dipendenze: Se Fi è l’insieme delle dipendenze in F+ che includono solo attributi in Ri allora 4 la decomposizione deve essere “dependency preserving”, cioé (F 1 F 2 … Fn)+ = F+ 4 altrimenti, il controllo delle violazioni delle dipendenza funzionali (dello schema originario) comporterebbe la computazione esplicita di operazioni di join (sono le più costose).
Esempio n R = (A, B, C) F = {A B, B C) H può essere decomposto in due modi diversi n R 1 = (A, B), R 2 = (B, C) H decomposizione senza perdite H conserva le dipendenze n R 1 = (A, B), R 2 = (A, C) H decomposizione senza perdite H non conserva le dipendenze: (non posso controllare se viene violato il vincolo B C senza calcolare R 1 R 2)
Verificare la conservazione delle dipendenze n Per verificare se la dipendenza è preservata in una decomposizione di R in R 1, R 2, …, Rn applichiamo il seguente test (le chiusure di attributi sono fatte rispetto a F) H result = while (result cambia) do for each Ri nella decomposizione t = (result Ri)+ Ri result = result t H Se result contiene tutti gli attributi in , allora la dipendenza funzionale è preservata. n Applicheremo il test su tutte le dipendenze in F. n Questa procedura impiega un tempo polinomiale, mentre un tempo esponenziale viene impiegato dalla computazione di F+ e di (F 1 F 2 … F n )+
Richiamo: Boyce-Codd Normal Form Uno schema di relation R(X) è in BCNF rispetto a un insieme F di dipendenze funzionali, se per ogni dipendenza in F+ della forma , con X and X, almeno una delle seguenti condizioni vale: n è banale (ovvero, ) n è superchiave di R(X)
Esempio n R(X) = (A, B, C) F = {A B B C} Chiave = {A} n R non è in BCNF n Decomposizione: R 1 = (A, B), R 2 = (B, C) H R 1 e R 2 sono in BCNF H la decomposizione è senza perdite H e preserva le dipendenze
Test per BCNF n Per verificare se una dipendenza funzionale non banale causa una violazione della BCNF 1. computare + (la chiusura di ), e 2. verificare se include tutti gli attributi di R, cioè se + è superchiave per R. n Test semplificato: per verificare se uno schema R è in BCNF, è sufficiente verificare solo che le dipendenze del dato insieme F non violano la BCNF (invece che controllate tutte le dipendenze in F+). Infatti: H se nessuna delle dipendenze in F causa una violazione della BCNF, allora nessuna delle dipendenze in F+ causa una violazione della BCNF. n Tuttavia, utilizzare solo F è scorretto quando si effettua il test su una relazione della decomposizione di R. Esempio: H consideriamo R (A, B, C, D), con F = { A B, B C} 4 decomponiamo R in R 1(A, B) e R 2(A, C, D) 4 nessuna delle dipendenze in F contiene solo attributi di (A, C, D), quindi potremmo credere che R 2 soddisfi BCNF. 4 tuttavia, la dipendenza A C in F+ mostra che R 2 non è in BCNF.
Algoritmo per la decomposizione in BCNF result : = {R}; done : = false; calcola F+; while (not done) do if (esiste uno schema R’ in result che non è in BCNF) then begin sia una dipendenza non banale di R’ tale che R’ non è in F+, e che = ; result : = (result – R’ ) (R’ – ) ( , ); end else done : = true; Nota: ogni R’ è in BCNF, e la decomposizione è senza perdite
Esempio n R = (nome. Ditta, città, indirizzo, nome. Cliente, codice. Merce, ammontare) F = {nome. Ditta città indirizzo codice. Merce ammontare nome. Ditta} Key = {nome. Cliente, codice. Merce} n Decomposizione H R 1 = (nome. Ditta, città, indirizzo) H R 2 = (nome. Ditta, nome. Cliente, codice. Merce, ammontare ) H R 3 = (nome. Ditta, codice. Merce, ammontare ) H R 4 = (nome. Cliente, codice. Merce) n Decomposizione finale R 1 , R 3 , R 4
Test BCNF per la decomposizione n Per verificare se uno schema Ri di una decomposizione di R è in BCNF, H o verificare se Ri è in BCNF rispetto alla restrizione di F su Ri (cioé, tutte le dip. funz. in F+ che contengono solo attributi di Ri) H oppure effettuare sull’insieme originale di dip. funz. F su R, il seguente test: – per ogni insieme di attributi Ri, verificare che + o non includa attributi di Ri- , o includa tutti gli attributi di Ri. 4 se la condizione è violata da qualche dip. funz. ( + - ) Ri vale in Ri, e Ri viola la BCNF. in F, si dimostra che la 4 Le dipendenze di questo tipo saranno sfruttate per decomporre ulteriormente lo schema Ri
BCNF e conservazione delle dipendenze Non è sempre possibile ottenere una BCNF che conservi le dipendenze. Esempio: n R = (J, K, L) F = {JK L L K} due chiavi candidate: JK e JL n R non è in BCNF n ogni possibile decomposizione di R non preserva JK L
Third Normal Form: motivazioni n Ci sono casi in cui H BCNF non preserva le dipendenza, mentre H è necessario avere una procedura efficiente per impedire le violazioni delle dip. funz. n Soluzione: definire una forma normale più debole. H ammettere della ridondanza (con i conseguenti svantaggi; vedremo esempio) H ma le dip. funz. possono essere controllate sulle relazioni senza computare alcun join. H esiste sempre una decomposizione in 3 NF che conserva le dipendenze.
Third Normal Form n Uno schema R è in 3 NF se per ogni in F+ vale almeno una delle seguenti condizioni: H è banale (cioé, ) H è superchiave di R H ogni attributo A in – è contenuto in una chiave candidata di R. (Nota: attributi diversi possono essere contenuti in chiavi differenti) n Una relazione in BCNF è anche in 3 NF. n La terza condizione è il rilassamento della BCNF che assicura la conservazione delle dipendenze.
3 NF (Cont. ) n Esempio H R = (J, K, L) F = {JK L, L K} H due chiavi candidate: JK e JL H R è in 3 NF JK L L K JK è superchiave K è contenuto in una chiave candidata n la decomposizione in BCNF ha i due schemi (JL) e (LK) n verificare il rispetto della dip. funz. JK L richiederebbe un join n c’è ridondanza in questo schema n altro esempio: Vendite (nome. Produttore, nome. Cliente, nome. Rappresentante) nome. Rappresentante nome. Produttore nome. Cliente nome. Rappresentante
Test per la 3 NF n Ottimizzazione: dobbiamo controllare solo le dip. funz. in F, non è necessario controllare tutte le dip. in F+. n Utilizziamo la chiusura di attributi per verificare se per una data dip. funz. , è superchiave. n Se non è superchiave, dovremmo verificare se ogni attributo in è contenuto in una chiave candidata di R. Ma: H questo test è costoso perché impone di calcolare le chiavi candidate H si dimostra infatti che il test di 3 NF è un problema NP-hard H TUTTAVIA, la decomposizione in 3 NF può essere calcolata in tempo polinomiale
Algoritmo di decomposizione in 3 NF Sia Fc una copertura canonica di F; i : = 0; for each dip. funz. in Fc do if nessuno degli schemi Rj, 1 j i contiene then begin i : = i + 1; Ri : = end if nessuno degli schemi Rj, 1 j i contiene una chiave candidata di R then begin i : = i + 1; Ri : = gli attributi di una chiave candidata di R; end return (R 1, R 2, . . . , Ri)
Algoritmo di decomposizione in 3 NF (Cont. ) n Si dimostra che l’algoritmo visto è tale che H è corretto H ogni schema Ri è in 3 NF H la decomposizione conserva le dipendenze ed è senza perdite
Esempio n Schema dato: R (nome. Ditta, nome. Cliente, nome. Impiegato, numero. Ufficio) n dipendenze funzionali: nome. Impiegato nome. Ditta numero. Ufficio nome. Cliente nome. Ditta nome. Impiegato n chiave: {nome. Cliente, nome. Ditta}
Applichiamo l’algoritmo. . . n Il ciclo for inserisce i seguenti schemi nella decomposizione: S (nome. Impiegato, nome. Ditta, numero. Ufficio) T (nome. Cliente, nome. Ditta, nome. Impiegato) n Dato che T contiene una chiave candidata per R, abbiamo concluso la decomposizione
Comparazione di BCNF e 3 NF n Per ogni dato schema è sempre possibile calcolare una 3 NF H senza perdite H che conserva le dipendenze n Per ogni dato schema è sempre possibile calcolare una BCNF H senza perdite H potrebbe non preservare tutte le dipendenze
Comparazione di BCNF e 3 NF (Cont. ) n Esempio di problemi dovuti alla ridondanza ammessa dalla 3 NF: H R = (J, K, L) F = {JK L, L K} J L K j 1 l 1 k 1 j 2 l 1 k 1 j 3 l 1 k 1 null l 2 k 2 Uno schema in 3 NF ma non in BCNF comporta: n ripetizione di informazioni (ad es. , la coppia di dati l 1, k 1) n necessita l’impiego di valori nulli (ad es. , per rappresentare la correlazione tra l 2, e k 2 quando non ci siano corrispondenti valori per J).
Obiettivi della progettazione n Obiettivi del progetto di database relazionali sono: H BCNF. H Decompisizioni senza perdite. H Conservazione delle dipendenze. n Se questo non è raggiungibile, possiamo scegliere se H rinunciare alla conservazione di (alcune) dipendenze H ammettere la ridondanza dovuta a 3 NF n SQL fornisce un modo diretto per imporre delle generiche dipendenze funzionali nella definizione degli schemi; ma solo le dipendenze dovute a superchiavi. Le altre dip. funz. possono essere imposte tramite l’uso di asserzioni, tuttavia queste sono più costose da valutare. n Quindi anche se scegliamo una decomposizione che preserva le dipendenze, non abbiamo un modo diretto/efficiente per imporle/valutarle in SQL.
Test delle dip. funz. in più relazioni n Se la decomposizione che abbiamo scelto non preserva le dipendenze, possiamo definire una vista materializzata per ciascuna dep. in Fc che non è preservata dalla decomposizione n La vista materializzata è definita come proiezione su del join delle relazioni della decomposizione n Molti database system recenti supportano la definizione di viste materializzate e mantengono aggiornata la vista quando le relazioni sono modificate. n La dip. funz. viene imposta dichiarando che è una chiave della vista. n Il test di chiave per nella vista è più efficiente del test di sulla decomposizione n MA: H maggior spazio di memoria occupato: per memorizzare la vista materializzata H maggior tempo di elaborazione: per mantenere aggiornata la vista materializzata H alcuni database system non supportano la definizione di una chiave sulle viste materializzate
Dipendenze Multivalore n Esistono schemi che sono in BCNF ma che appaiono non sufficientemente normalizzati n Consideriamo lo schema lezione(corso, docente, libro) tale che (c, d, l) lezione significa che il docente d ha la qualifica per insegnare il corso c, e l è il libro di testo utilizzato in c n per ogni corso si memorizzano tutti gli insegnanti che hanno titolo a insegnare quel corso e l’insieme dei libri di quel corso (indipendentemente da quale docente insegna realmente il corso).
Dipendenze Multivalore (Cont. ) corso database database operating systems docente Avi Hank Sudarshan Avi Jim libro DB Concepts Ullman OS Concepts Shaw lezione n Non ci sono dip. funz. non banali e lo schema è BCNF n ci sono anomalie di inserzione – ad es. , se Sara è un nuovo docente di database, si devono inserire le due tuple (database, Sara, DB Concepts) (database, Sara, Ullman)
Dipendenze Multivalore (Cont. ) n È meglio decomporre in: corso docente database operating systems Avi Hank Sudarshan Avi Jim insegna corso libro database operating systems DB Concepts Ullman OS Concepts Shaw adotta Vedremo che questo schema è in quarta forma normale (4 NF)
Dipendenze Multivalore (MVDs) n Sia R(X) uno schema e siano X e X. Una dipendenza multivalore sussiste in R se in ogni sua istanza r, per ogni coppia di tuple t 1 e t 2 in r tali che t 1[ ] = t 2 [ ], esistono le tuple t 3 e t 4 in r tali che: t 1[ ] = t 2 [ ] = t 3 [ ] = t 4 [ ] t 3[ ] = t 1 [ ] t 3[X – ] = t 2[X – ] t 4 [ ] = t 2[ ] t 4[X – ] = t 1[X – ]
MVD (Cont. ) n Visualmente si può rappresentare questa condizione di esistenza di in questo modo:
Esempio n Sia R uno schema il cui insieme X di attributi è partizionato in 3 sottoinsiemi non vuoti. Y, Z, W n Diciamo che Y Z (Y multidetermina Z) se e solo se per ogni possibile istanza r di R tale che < y 1, z 1, w 1 > r e < y 2, z 2, w 2 > r si ha < y 1, z 1, w 2 > r e < y 2, z 2, w 1 > r n Nota che in questa definizione il ruolo di Z e W è identico, quindi da Y Z segue che Y W
Esempio (Cont. ) n Nell’esempio precedente: corso docente corso libro n La definizione formale che abbiamo dato esprime la situazione in cui ad un particolare valore di Y (corso) è associato un insieme di valori distinti per Z (docente) e un insieme di valori distinti per W (libro); inoltre questi due insiemi sono indipendenti l’uno dall’altro. n Nota: H se Y Z allora Y Z
Teoria delle MVD n La seguente legge deriva dalla definizione di dip. multivalore: H Se , allora Ovvero, ogni dip. funz. è anche una dip. Multivalore n La chiusura D+ di un insieme di dipendenze D è l’insieme di tutte le dipendenze funzionale o multivalore implicate logicamente da D. H Possiamo calcolare D+ sfruttando le definizioni di dipendenze funzionale e multivalore. H Ciò può essere fatto nei casi più semplici H Per i casi complessi si impiega un insieme di regole di inferenza similmente a quanto visto con gli assiomi di Armstrong.
Regole di inferenza per le D. M. V. Questo è un insieme corretto e completo di regole di inferenza per le dip. multivalore (nota che una dip. funzionale è una dip. multivalore). Sia X l’insieme di tutti gli attributi di R, e siano X : n riflessività (DF): se , allora n arricchimento (DF): se , allora n transitività (DF): se , allora n complementazione (DMV): se , allora (X - ) n arricchimento (DMV): se e allora n transitività (DMV): se , allora ( - ) n replicazione: se , allora n coalescenza: se e ed esiste disgiunto da tale che allora
Quarta forma normale n Uno schema R(X) è in 4 NF rispetto ad un insieme di dipendenze (funzionali o multivalore) D se per tutte le dipendenze multivalore in D+ della forma , con X and X, vale almeno una delle seguenti condizioni: H è banale (cioé, oppure = X) H è una superchiave per lo schema R(X) n Una relazione in 4 NF è anche in BCNF
Algoritmo di Decomposizione in 4 NF result: = {R}; done : = false; calcola D+; while (not done) if (esiste uno schema Ri in result che non sia in 4 NF) then begin sia una delle dip. multivalore di D+ non banali che causa la violazione della 4 NF su Ri. Sia result : = (result - Ri) (Ri - ) ( , ); end else done: = true; Nota: ogni Ri è in 4 NF e la decomposizione è senza perdite
Esempio n R =(A, B, C, G) F ={ A B, A C, A G } unica chiave: ACG n R non è in 4 NF perché tutte tre le dipendenze violano la def. di 4 NF n Decomposizione di R: a) R 1 = (A, B) (R 1 è in 4 NF) b) R 2 = (A, C, G) (R 2 non è in 4 NF) n Decomposizione di R 2 c) R 3 = (A, C) (R 3 è in 4 NF) d) R 4 = (A, G) (R 4 è in 4 NF)
n Finora abbiamo assunto dato uno schema R. Questo può essere prodotto come: H risultato della conversione di uno schema E-R nel modello relazionale H oppure, R potrebbe essere un singolo schema di relazione contenente tutti gli attributi di interesse (relazione universale) H oppure, R potrebbe essere stato generato con qualche procedimento non specificato e necessita di una verifica di qualità ed eventualmente di una conversione in forma normale.
Modellazione ER e Normalizzazione n Qualora uno schema ER sia progettato opportunamente, identificando correttemente tutte le entità, le relazioni prodotte dalla traduzione nel modello relazionale non necessitano solitamente di normalizzazione. n Tuttavia, nei (complessi e imperfetti) processi di progetto reali possono prodursi dip. funz. da attributi non di chiave verso altri attributi della stessa entità. n Dip. funzionali da parte di attributi non di chiave sono possibili ma rare in quanto nella maggioranza dei casi pratici molte associazioni sono binarie.
Denormalizzazione per la performance n Potremmo voler utilizzare schemi non normalizzati per aumentare la performance n Ad es. mostrare assieme informazioni memorizzate in due tabelle differenti richiede il join delle tabelle n Alternativa 1: usare schemi denormalizzati che contengono gli attributi di entrambe le relazioni H accesso più veloce H spazio e tempo di esecuzione superiore per gestire le modifiche H maggiore sforzo di programmazione per gestire la ridondanza, conseguente maggiore incidenza degli errori di programmazione n Alternativa 2: usare una vista materializzata H stessi vantaggi e svantaggi della alternativa 1, eccetto il maggiore sforzo di programmazione.
- Slides: 55