Spring til indhold
Academi.dk

SQL

Normalisering

Øvet DA↔EN-ordliste

Normalisering er at fordele data i tabeller, så hver oplysning kun står ét sted. Første normalform kræver én værdi pr. felt, anden at alt afhænger af hele nøglen, og tredje at ingen kolonne afhænger af en anden ikke-nøglekolonne.

Forudsætter, at du har set primærnøgler og fremmednøgler .

Problemet, der skal væk

Her er en tabel, der gemmer det hele ét sted:

ordre_idkundekunde_emailprodukterpostnrby
1Ida[email protected]“kaffe, kop”2000Frederiksberg
2Ida[email protected]“kop”2000Frederiksberg

Tre problemer, og de har navne:

  • Opdateringsanomali: skifter Ida e-mail, skal den rettes i alle hendes ordrer. Glemmer du én, har databasen nu to sandheder.
  • Indsættelsesanomali: du kan ikke oprette en kunde, før de har lagt en ordre.
  • Sletteanomali: sletter du ordre 2, forsvinder måske den sidste oplysning om kunden.

Normalisering fjerner dem, ét skridt ad gangen.

Første normalform: én værdi pr. felt

Kolonnen produkter indeholder en liste. Det bryder 1NF. Løsningen er en række pr. produkt, altså en ordrelinjetabel.

ordre(id, kunde_id, dato)
ordrelinje(ordre_id, produkt_id, antal)

Samme regel forbyder produkt1, produkt2, produkt3 som kolonner. Skal der være plads til en mere, skal du ikke ændre tabellen. Du skal tilføje en række.

Anden normalform: afhæng af hele nøglen

2NF gælder kun, når nøglen består af flere kolonner. Antag, at ordrelinje har nøglen (ordre_id, produkt_id) og også en kolonne produktnavn.

Produktnavnet afhænger kun af produkt_id, ikke af hele nøglen. Så hører det ikke til her. Det hører til i produkt.

ordrelinje(ordre_id, produkt_id, antal, pris_paa_koebstidspunktet)
produkt(id, navn, aktuel_pris)

Tredje normalform: ingen omveje

3NF siger, at en kolonne ikke må afhænge af en anden kolonne, der ikke er nøglen.

I kundetabellen med postnr og by afhænger by af postnr, og postnr afhænger af kunden. Det er en omvej. Strengt taget skal by flyttes til en postnummertabel.

kunde(id, navn, email, postnr)
postnummer(postnr, by)

Sætningen, man plejer at citere, er: hver ikke-nøglekolonne skal afhænge af nøglen, hele nøglen og intet andet end nøglen. Kan du sige den og give ét eksempel på hvert af de tre led, kan du 3NF godt nok til eksamen.

Hvor langt skal man gå?

3NF er målet i et førsteårsprojekt, og det er også der, litteraturen stopper for de fleste praktiske formål. Går I bevidst på kompromis, for eksempel ved at gemme en totalsum, der kunne regnes ud, så skriv i rapporten, at I ved det, og hvorfor. Et bevidst valg med en begrundelse bedømmes helt anderledes end en tilfældighed.

Kort opsamling

  • 1NF: én værdi pr. felt, ingen lister og ingen nummererede kolonner.
  • 2NF: alt skal afhænge af hele den sammensatte nøgle.
  • 3NF: ingen kolonne må afhænge af en anden ikke-nøglekolonne.
  • Historiske værdier som pris på købstidspunktet er en begrundet undtagelse.

Læs videre

Senest gennemgået .