Normalisering

Denne introduksjonen til normalisering har som mål å vise prosessen fra universalrelasjonen til 3. normalform.
For enkelthelt skyld vil jeg bruke et eksempel som jeg har vist tidligere, nemlig pasientregisteret.
Primærnøkler er merket med grønt

Universalrelasjonen

Dette er den første samlingen av data vi har, her ligger alle dataene som trengs i kun 1 tabell.
Universalrelasjonen kan defineres som et slags halvordnet kaos som vi sakte med sikkert rydder opp i.
I universalrelasjonen er det ingen regler annet enn at man har rader og kolonner.

Eksempel på universalrelasjon

fastlege_id fastlege_navn fastlege_adr fastlege_tlf pasient_personnr pasient_navn pasient_adr pasient_tlf pasient_yrke
1 Einor Ilderhaug Gamlebyen legekontor, 1601 Fredrikstad 69 327698 12075622346
23106901038
Arne B. Olsen
Ilma S. Arnesen
Slåttveien 2, 1602 Fredrikstad
Sommerstien 3, 1621 Gressvik
69 324567
69 316534
Politi
Syerske
3 Elling Pedersen Nordsiden legekontor, 1750 Halden 69 185634 31017334723 Eivind Moen Himlingveien 3, 1767 Halden 60 175623 Advokat

1. normalform

For at en tabell skal kunne være i 1. normalform, kan den ikke inneholde ikke-atomære verdier eller repeterende grupper.

Ikke-atomære verdier: Verdier som inneholder flere delverdier
Repeterende grupper: At det finnes mer enn en verdi i krysset mellom rad og kolonne i tabellen

I vår tabell er det følgende brudd på 1. normalform:
Ikke-atomære verdier: pasient_adr(inneholder gateadresse, postnr og poststed)
Repeterende grupper: pasient_personnr, pasient_navn, pasient_adr, pasient_tlf og pasient_yrke

NB! I noen tilfeller vil det være hensiktsmessig å dele opp i flere tabeller allerede i 1. normalform. Har man mange kolonner vil det kunne se direkte merkelig ut å ikke dele opp i undertabeller.
Et eksempel på dette er en bedrift med kunder, ansatte, varer, bestillinger, leveringsbud osv. Dette vil bli en diger universalrelasjon og en 1. normalform full av null-verdier, hvis dataene skal bli riktig, og dette er ikke hensiktsmessig. Da er det bedre å begynne å splitte litt logisk opp med det samme. Man kan da oppleve at man allerede er i 2. normalform når man er ferdige med å rydde.

Når bruddene er rettet opp, er tabellen vår i 1. normalform, og da ser det slik ut:

fastlege_id pasient_personnr fastlege_navn fastlege_adr fastlege_postnr fastlege_poststed fastlege_tlf pasient_navn pasient_adr pasient_postnr pasient_poststed pasient_tlf pasient_yrke
1 12075622346 Einor Ilderhaug Gamlebyen legekontor 1601 Fredrikstad 69 327698 Arne B. Olsen Slåttveien 2 1602 Fredrikstad 69 324567 Politi
1 23106901038 Einor Ilderhaug Gamlebyen legekontor 1601 Fredrikstad 69 327698 Ilma S. Arnesen Sommerstien 3 1621 Gressvik 69 316534 Syerske
3 31017334723 Elling Pedersen Nordsiden legekontor 1750 Halden 69 185634 Eivind Moen Himlingveien 3 1767 Halden 60 175623 Advokat

2. normalform

For at en tabell skal kunne være i 2. normalform, må alle verdier være fullt funksjonelt avhengig av primærnøkkelen.

Full funksjonell avhengighet: Betyr at man ikke har noen partielle avhengigheter
Partiell avhengighet: Betyr at en verdi er avhengig av kun deler av primærnøkkelen

I vår tabell er det følgende brudd på 2. normalform:
Partielle avhengigheter(p.a.a.):
 fastlege_navn er p.a.a. fastlege_id(avhengig av fastlege_id, men ikke pasient_personnummer)
 pasient_navn er p.a.a. pasient_personnr(avhengig av pasient_personnummer, men ikke fastlege_id)

Når bruddene er rettet opp, er tabellen vår i 2. normalform, og da ser det slik ut:

Fastlege

fastlege_id fastlege_navn fastlege_adr fastlege_postnr fastlege_poststed fastlege_tlf
1 Einor Ilderhaug Gamlebyen legekontor 1601 Fredrikstad 69 327698
3 Elling Pedersen Nordsiden legekontor 1750 Halden 69 185634

Pasient

pasient_personnr pasient_navn pasient_adr pasient_postnr pasient_poststed pasient_tlf pasient_yrke fastlege_id
12075622346 Arne B. Olsen Slåttveien 2 1602 Fredrikstad 69 324567 Politi 1
23106901038 Ilma S. Arnesen Sommerstien 3 1621 Gressvik 69 316534 Syerske 1
31017334723 Eivind Moen Himlingveien 3 1767 Halden 60 175623 Advokat 3

3. normalform

For at en tabell skal kunne være i 3. normalform, kan man ikke ha noen transitive avhengigheter

Transitiv avhengighet: Betyr at en verdi er avhengig av en annen ikke-primærnøkkel-verdi

I vår tabell er det følgende brudd på 3. normalform:
Transitive avhengigheter:
 poststed er transitivt avhengig av postnr(men postnr er ikke noen primærnøkkel)

Når bruddene er rettet opp, er tabellen vår i 3. normalform, og da ser det slik ut:

Fastlege

fastlege_id navn adresse postnr tlf
1 Einor Ilderhaug Gamlebyen legekontor 1601 69 327698
3 Elling Pedersen Nordsiden legekontor 1750 69 185634

Pasient

personnr navn adresse postnr tlf yrke fastlege_id
12075622346 Arne B. Olsen Slåttveien 2 1602 69 324567 Politi 1
23106901038 Ilma S. Arnesen Sommerstien 3 1621 69 316534 Syerske 1
31017334723 Eivind Moen Himlingveien 3 1767 60 175623 Advokat 3

Poststed

postnr poststed
1601 Fredrikstad
1602 Fredrikstad
1621 Gressvik
1750 Halden
1767 Halden

Boyce-Codd normalform

For at en tabell skal kunne være i Boyse-Codd normalform, må alle determinanter være kandidatnøkler

Determinant: Attributt eller gruppe attributter som en annen attributt er fullt funksjonelt avhengig av
Supernøkkel: Et eller flerer attributter som sammen identifiserer en entitet unikt
Kandidatnøkkel: Minimalistiske supernøkler, dvs at man kan fjerne et attributt fra en supernøkkel og så er det fortsatt unikt

I vår tabell er det ingen brudd på Boyce-Codd normalform:
Determinanter: personnr(pasient); postnr(poststed); fastlege_id(fastlege)
Kandidatnøkkler: personnr(pasient); postnr(poststed); fastlege_id(fastlege)