Normalisering Varför? För att åstadkomma en så bra struktur i databasen som möjligt med minimalt med dubbellagrad info. Tillbaka i modelleringsfasen. 1NF: Vad menas med ett sammansatt attribut? Exempel: pnr ger all personinfo, där personinfo kan ha värdet Per Jonsson, Fiskvägen 3, 412 45 Bergsjö Bör delas upp i flera attribut: namn, (gatu)adress, postnr, ort 2-3 NF: Innehåller nya begrepp, de förklaras bäst med exempel Funktionella beroenden Attributen A, B, C, D, E och F utgör hela U (universum), dvs alla attribut i den blivande databasen. A --> B, C omm varje värde på A ger EXAKT ETT värde på B och EXAKT ETT värde på C. D, E --> F omm varje kombination av värden på D och E ger EXAKT ETT värde på F. Kandidatnycklar En nyckel är ett eller flera attribut som tillsammans ger unika värden på ALLA attribut i hela databasen. En kandidatnyckel är en nyckel som är minimal, dvs kandidatnyckeln ger hela U men om vi tar bort ett enda attribut från den så har vi inte längre en nyckel. Ex U = { A, B, C, D, E, F} A --> B, C D, E --> F Nycklar: { A, B, C, D, E, F}, { A, B, C, D, E,},{ A, B, D, E, F}, { A, C, D, E, F}, { A, B, D, E,}, { A, C, D, E,}, { A, D, E, F} och { A, D, E} Kand nyckel: endast { A, D, E}. (I detta fall finns bara en kand nyckel.) I verkligheten * STORA Relationer (många attribut) * MÅNGA Relationer (många tabeller) Långt ifrån säkert att en bra modellering ger 3NF. DÅ: 1) Modellera 2) För varje databasrelation - normalisera till 3NF 3) Rita modell... MEN i våra babyexempel (jämfört med verkligheten) så får man vanligen 3NF direkt. Så för att ni ska få en chans att se vad normalisering går ut på, så normaliserar vi UTAN att modellera först.
Uppgift 1 Direkt överföring ej möjlig. Varför? Jo på kortet ges alla uppgifter av pnr, men för en databas gäller inte detta. En anställd har flera försäkringar och flera anhöriga. Vad har vi för attribut? U = {Namn, pnr, Adress, Ptnr, Ptadress, ADatum, Lön, Förstyp, AnhNamn, Anhpnr, AnhRel} (11 st) I) Identifiera de funktionella beroendena! (FD) pnr --> Namn, Adress, Ptnr, Ptadress, ADatum, Lön Ptnr --> Ptadress Anhpnr --> AnhNamn pnr, Anhpnr --> AnhRel Värdet på Förstyp ger ingen unik info om något annat attributs värde. II) Beräkna transitiva höljen! Dvs mängden av de attribut som via de funktionella beroendena ges av VL:t. {pnr} + = {pnr, Namn, Adress, Ptnr, Ptadress, ADatum, Lön} {Ptnr} + = {Ptnr, Ptadress} {Anhpnr} + = {Anhpnr, AnhNamn} {pnr, Anhpnr} + = { pnr, Anhpnr, AnhRel, Namn, Adress, Ptnr, Ptadress, ADatum, Lön, AnhNamn} = U \ {Förstyp} Eftersom Förstypen ej ges av något annat attribut måste den ingå i varje kandidatnyckel. {pnr, Anhpnr, Förstyp} + = { pnr, Anhpnr, Förstyp, AnhRel, Namn, Adress, Ptnr, Ptadress, ADatum, Lön, AnhNamn} = U Är en kandidatnyckel. Finns det fler? Nej. Ty: Anhpnr är det enda attribut som ger AnhNamn, pnr måste finnas för namn, lön mm, kan inte heller tas bort OCH alla andra attribut ges av dessa tre, så om något av dem läggs till har vi inte längre en minimal nyckel. III) Välj primärnyckel = vår enda kand nyckel ((pnr, Anhpnr, Förstyp) Namn, Adress, Ptnr, Ptadress, ADatum, Lön, AnhNamn, AnhRel) (11 st) 1NF Prima attribut, Icke-prima attribut Beror alla icke-prima attribut på hela nyckeln? Nej! Namn beror tex inte på förstyp,... Så vi ska bryta ut. Vilka attribut beror bara av pnr? (Se de transitiva höljena) Identifiera och bryt ut! ((pnr) Namn, Adress, Ptnr, Ptadress, ADatum, Lön) Kvar i den andra relationen just nu: ((pnr, Anhpnr, Förstyp), AnhNamn, AnhRel)
Beror AnhNamn på hela hela nyckeln? Nej! Bryt ut ((Anhpnr) AnhNamn) Kvar i den andra relationen just nu: ((pnr, Anhpnr, Förstyp), AnhRel) Beror AnhRel på hela hela nyckeln? Nej! Bryt ut ((pnr, Anhpnr) AnhRel) Alltså får vi: ((pnr) Namn, Adress, Ptnr, Ptadress, ADatum, Lön) ((Anhpnr) AnhNamn) ((pnr, Anhpnr) AnhRel) ((pnr, Anhpnr, Förstyp)) 2NF Finns det någon relation ovan där något icke-primt attribut beror på något annat icke-primt attribut? JA! ((pnr) Namn, Adress, Ptnr, Ptadress, ADatum, Lön) Bryt ut! (OBS! Ptnr KVARSTÅR!!!) Anställd: ((pnr) Namn, Adress, Ptnr, ADatum, Lön) Boende: ((Ptnr) Ptadress) Anhörig: ((Anhpnr) AnhNamn) FamMedlem: ((pnr, Anhpnr) AnhRel) Försäkrad: ((pnr, Anhpnr, Förstyp)) 3NF Måste kolla att resultatet blev vettigt! Använd reverse engineering dvs gå från dbstruktur --> modell. Hur? På den här kursen kan ni utgå ifrån att en relation med EN I-term är ett objekt och att relationer med X st I-termer (X > 1) är ett samband mellan X objekt. FamMedlem är alltså M:N, Försäkrad har ordning 3. Eftersom det saknas relation som har Förstyp som I-term måste det vara en objektklass utan E-termer. Tänk också på att leta efter försvunna 1:N och 1:1 samband i objektens E-termer. Ptnr i Anställd är just länken Bor till Boende.
Vettigt? Nja bättre med ------ (Försäkring beror inte av anhöriga) Leder till ändringen: Försäkring: ((pnr, Anhpnr, Förstyp)) blir i stället ((pnr, Förstyp)) Då relationen saknar icke-prima attribut ==> fortfarande i 3NF Uppgift 2 Vad har vi för attribut? U = { pnr, namn, Libet, Hlpnr, Hlnamn, Hlrum, Hltel, Pjnr, Pjnamn, Pjbeskr, Pjpoäng, Ipoäng, datum} (13 st) Antagande: Varje projekt har (exakt) en handledare. Varje handledare har exakt ett telnr. I) Identifiera de funktionella beroendena! (FD) pnr --> namn, Libet Hlpnr --> Hlnamn, Hlrum, Hltel Pjnr --> Pjnamn, Pjbeskr, Pjpoäng, Hlpnr pnr, pjnr --> Ipoäng, datum II) Beräkna transitiva höljen! {pnr} + = {pnr, Namn, Libet} {Pjnr} + = {Pjnr, Pjnamn, Pjbeskr, Pjpoäng, Hlpnr, Hlnamn, Hlrum, Hltel} {pnr, Pjnr} + = { pnr, Pjnr, Ipoäng, datum, Namn, Libet, Pjnamn, Pjbeskr, Pjpoäng, Hlpnr, Hlnamn, Hlrum, Hltel} = U Så, {pnr, Pjnr} är en kandidat nyckel. Finns det fler? Nej, ty inga attribut ger pnr eller Pjnr ==> de måste vara med i varje kandidatnyckel och eftersom de tillsammans är kandidatnyckel så finns inga fler. III) Välj primärnyckel = vår enda kand nyckel
((pnr, Pjnr) namn, Libet, Pjnamn, Pjbeskr, Pjpoäng, Hlpnr, Hlnamn, Hlrum, Hltel, Ipoäng, datum) Beror alla icke-prima attribut på hela nyckeln? Nej! Vilka attribut beror bara av pnr? (Se de transitiva höljena) Identifiera och bryt ut! ((pnr) Namn, Libet) Kvar i den andra relationen just nu: ((pnr, Pjnr), Pjnamn, Pjbeskr, Pjpoäng, Hlpnr, Hlnamn, Hlrum, Hltel, Ipoäng, datum) Vilka attribut beror bara av pnr? (Se de transitiva höljena) Identifiera och bryt ut! ((Pjnr) Pjnamn, Pjbeskr, Pjpoäng, Hlpnr, Hlnamn, Hlrum, Hltel) Kvar i den andra relationen just nu: ((pnr, Pjnr), Ipoäng, datum) Beror Ipoäng och datum på hela hela nyckeln? JA! Alltså får vi: ((pnr) Namn, Libet) ((Pjnr) Pjnamn, Pjbeskr, Pjpoäng, Hlpnr, Hlnamn, Hlrum, Hltel) ((pnr, Pjnr), Ipoäng, datum) 2NF Finns det någon relation ovan där något icke-primt attribut beror på något annat icke-primt attribut? JA! ((Pjnr) Pjnamn, Pjbeskr, Pjpoäng, Hlpnr, Hlnamn, Hlrum, Hltel) Bryt ut! (OBS! Hlpnr KVARSTÅR!!!) Student: ((pnr) Namn, Libet) Projekt: ((Pjnr) Pjnamn, Pjbeskr, Pjpoäng, Hlpnr) Handleder: ((Hlpnr) Hlnamn, Hlrum, Hltel) Studie: ((pnr, Pjnr), Ipoäng, datum) 3NF OH: Efter Normalisering Ser bra ut!
4) U = {Patnr, PatNamn, FamNr, FamNamn, FamAdr, BetBalans, TandStatus, ÅtgKod, ÅtgBeskr, Pris, Datum} (11) Funktionella beroenden (FD) PatNr PatNamn, FamNr, BetBalans, TandStatus FamNr FamNamn, FamAdr ÅtgKod ÅtgBeskr ÅtgKod, Datum Pris Viktigt att varje skärningspunkt mellan kolumn och rad, endast innehåller ett värde. Vad menar vi med FamAdr? Rimligen: adr, Ptnr, Ptadr. Tre olika saker! Dela upp! Ger 13 attribut i U. Ger även nytt FD: Ptnr PtAdr Hitta alla kandidatnycklar! Börja med att titta på de transitiva höljena. 1) Betrakta VL. {Patnr} + = {PatNr, PatNamn, FamNr, FamNamn, adr, Ptnr, PtAdr, BetBalans, TandStatus } {FamNr} + = { FamNr, FamNamn, adr, Ptnr, PtAdr } {ÅtgKod} + = {ÅtgKod, ÅtgBeskr } {ÅtgKod, Datum } + = {ÅtgKod, Datum, Pris, ÅtgBeskr } {Ptnr} + = { Ptnr, PtAdr }... Patnr, ÅtgKod, Datum står inte i HL i något FD. Måste ingå i varje kand.nyckel. {Patnr, ÅtgKod, Datum } + = U ==> Enda kandidatnyckeln. Prima attribut: Patnr, ÅtgKod, Datum Icke-prima: PatNamn, FamNr, FamNamn, adr, Ptnr, PtAdr, BetBalans, TandStatus, ÅtgBeskr, Pris
1NF ((Patnr, ÅtgKod, Datum) PatNamn, FamNr, FamNamn, adr, Ptnr, PtAdr, BetBalans, TandStatus, ÅtgBeskr, Pris ) (13) Beror alla icke-prima av hela nyckeln? NEJ! Bryt ut! 2NF ((Patnr), PatNamn, FamNr, adr, Ptnr, PtAdr, FamAdr, BetBalans, TandStatus) ((ÅtgKod) ÅtgBeskr) ((ÅtgKod, Datum), Pris ) ((Patnr, ÅtgKod, Datum)) Finns det något transitivt beroende? JA: PatNr FamNr FamNamn, adr, Ptnr, PtAdr ÄVEN: FamNr Ptnr PtAdr Bryt ut! 3NF Patient ((Patnr), PatNamn, FamNr, BetBalans, TandStatus) Familj ((FamNr), FamNamn, adr, Ptnr) Boende ((Ptnr) PtAdr) Åtgärd ((ÅtgKod) ÅtgBeskr) Kostnad ((ÅtgKod, Datum), Pris ) Behandling ((Patnr, ÅtgKod, Datum))