Normalform (databaser)

Normalformer är i samband med relationsdatabaser ett systematiskt sätt att se till att databasstrukturen är lämplig för normala frågedatabaser så att inga oönskade anomalier vid insättning, uppdatering eller borttagning kan ske, och därmed att skydda databasens integritet. De vanligaste är 1NF, 2NF, 3NF och Boyce-Codds normalform (BCNF). Inte lika ofta implementerade är 4NF, 5NF och 6NF. Dessa anger, i ökande grad av strikthet, ett antal krav på databasens utseende. 1NF räcker för skapa en databas, men vid lägre normalform ökar risken för att anomalier när data uppdateras.

För tabeller som ingår i så kallade stjärnscheman i informationslager tillämpar man dock inte normalformerna (annat än kravet på bara ett värde per rad och attribut, vilket de flesta databasmotorer kräver).

Första normalformen (1NF)

Första normalformen innebär att varje cell endast innehåller ett värde.[1] Det förutsätts dessutom att raderna är unika, annars är det ingen tabell.[2]

Exempel på 1NF

Följande tabell är i 1NF då varje cell bara innehåller ett värde. I tabellen är primärnyckeln persnr + avdnr. Då attributen namn och avdnamn bara är beroende av en del av primärnyckeln klarar tabellen inte 2NF.

Kund
persnrnamnavdnravdnamn
P1LinaA1Mjällby
P1LinaA2Orsa
P2KarlA1Mjällby
P2KarlA3Landskrona


Exempel på normalisering

Tabellen innehåller flera värden i varje cell i kolumnen telenr och är därför inte i första normalformen.

Kund
kundnrkundnamntelenr
K001Lina111, 222
K002Denise333, 444
K003Robert555, 666

För att uppfylla 1NF kan telenr sättas i en separat tabell:

Kund
kundnrkundnamn
K001Lina
K002Denise
K003Robert
KundTelefonnr
kundnrtelenr
K001111
K001222
K002333
K002444
K003555
K003666

Nu är kundnr i tabellen KundTelefonnr en främmande nyckel som hänvisar till primärnyckeln i tabellen Kund.

Andra normalformen (2NF)

För att vara i andra normalformen måste tabellen vara i första normalformen. Dessutom får det inte finnas några fullständiga funktionella beroenden mellan delar av primärnyckeln och attribut i tabellen. Ett fullständigt funktionellt beroende innebär dels att ett attribut är beroende av ett eller flera andra attribut, dels att de attribut som styr beroendet är så få som de kan vara utan att beroendet upphör.

Exempel på 2NF

I tabellen nedan är regnr primärnyckel. Då det bara finns ett attribut i nyckeln kan inga attribut vara beroende av en del av nyckeln. Därför är tabellen i 2NF. Attributet bränsle är beroende av ett icke-nyckel attribut, vilket gör att tabellen inte klarar kraven för 3NF.

Bilar
regnrmotorbränsle
BIL 001D1Diesel
BIL 002D1Diesel
BIL 003B1Bensin


Exempel på normalisering

Sammansatt nyckel för tabellen nedan är anstnr och certifikat. Anstnr eller anstnamn kan inte vara ensam nyckel då det kan finnas dubbletter för olika certifikat. Certifikat kan inte vara ensam nyckel då det kan finnas dubbletter när två anställda har samma certifikat. Attributet anstnamn är beroende av endast en del av den sammansatta nyckeln, nämligen anstnr, vilket gör att tabellen inte är i andra normalformen.

Anställda
anstnrcertifikatanstnamn
A001TrafikflygLena
A001SegelflygLena
A002TrafikflygKalle
A002SegelflygKalle

Problemen kan lösas genom att dela tabellen.

Anställda
anstnranstnamn
A001Lena
A002Kalle
Certifikat
anstnrcertifikat
A001Trafikflyg
A001Segelflyg
A002Trafikflyg
A002Segelflyg

Tredje normalformen (3NF)

För att vara i tredje normalformen, 3NF, måste tabellen vara i andra normalformen. Dessutom får det inte finnas några fullständiga funktionella beroenden mellan attribut utanför primärnyckeln, bara från och till primärnyckeln och delar av den.

Exempel på normalisering

I exemplet nedan är regnr primärnyckel. Bränsletypen är beroende av ett annat attribut, vilken motor som används. Tabellen är därför på andra normalformen men inte i tredje normalformen.

Bilar
regnrmotorbränsle
BIL 001D1Diesel
BIL 002D1Diesel
BIL 003B1Bensin
BIL 004B1Bensin

Problemet kan lösas genom att dela tabellen:

Bilar
regnrmotor
BIL 001D1
BIL 002D1
BIL 003B1
BIL 004B1
Motor
motorbränsle
D1Diesel
B1Bensin

Boyce-Codds normalform

Boyce-Codds normalform, BCNF, är samma som 3NF, med tillägget att det inte får finnas några beroenden från attribut utanför nyckeln in i den. Det fullständiga villkoret är alltså:

För att vara på Boyce-Codds normalform, BCNF, måste tabellen vara i andra normalformen. Dessutom får det inte finnas några fullständiga funktionella beroenden mellan attribut utanför primärnyckeln, bara från primärnyckeln (och även från delar av den).

Källor

Fotnoter

Litteratur

  • Connolly, Thomas M.; Begg Carolyn E. (2004) (på engelska). Database solutions: a step-by-step guide to building databases (2. ed.). Harlow: Addison-Wesley. Libris 9326776. ISBN 0-321-17350-3