SQL
Normalisering
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_id | kunde | kunde_email | produkter | postnr | by |
|---|---|---|---|---|---|
| 1 | Ida | [email protected] | “kaffe, kop” | 2000 | Frederiksberg |
| 2 | Ida | [email protected] | “kop” | 2000 | Frederiksberg |
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
- Datamodellering Datamodellering forklaret på dansk: fra beskrivelse til tabeller, entiteter og relationer, og hvordan en mange-til-mange-relation løses med en tredje tabel.
- Primærnøgler og fremmednøgler Primærnøgler og fremmednøgler forklaret på dansk med eksempler i SQL. Hvorfor de findes, hvordan de sættes op, og hvad referentiel integritet betyder.
- JOIN forklaret SQL JOIN forklaret på dansk: inner join, left join og forskellen på dem. Hvorfor du pludselig får flere rækker, end du forventede, og hvordan du undgår det.
Senest gennemgået .