Tilbake
6.5
Normalisering og databasedesign

6.5 Normalisering og databasedesign

Lær prinsippene for god databasedesign gjennom de tre normalformene.

60 min
7 oppgaver
NormaliseringRedundans1NF2NF
Du leser den tradisjonelle versjonen
Din fremgang i kapitlet
0 / 7 oppgaver

Normalisering og databasedesign

Forestill deg at ein skule lagrar all informasjon i éin einaste tabell:

elev_idfornavnetternavnklasselærerfagkarakter
1EmmaHansen10AKari NordliMatematikk5
1EmmaHansen10APer HaugenNorsk4
1EmmaHansen10ALise VikNaturfag5
2OliverJohansen10AKari NordliMatematikk3
2OliverJohansen10APer HaugenNorsk4

Ser du problema? Namnet og klassen til Emma blir gjentekne for kvar karakter. Viss Emma byter klasse, må vi oppdatere tre rader. Kva viss vi gløymer éi? Då har vi inkonsistente data. Og kva viss vi slettar alle karakterane til ein elev – forsvinn all informasjon om eleven?
Normalisering er løysinga. Det er ein systematisk metode for å organisere databasetabellar slik at dei unngår desse problema. I dette kapittelet skal du lære dei tre første normalformene og korleis du brukar dei til å designe gode databasar.

Unormaliserte tabellar (som den store enkelttabellen over) fører til tre typar problem kalla anomaliar:

1. Oppdateringsanomali


Når data er dupliserte og du endrar berre nokre førekomstar, blir dataa inkonsistente.

Døme: Emma Hansen byter frå 10A til 10B. Informasjonen «10A» finst i tre rader. Viss vi berre oppdaterer to av dei, står det 10B i to rader og 10A i éi rad – inkonsistens.

2. Innsettingsanomali


Du kan ikkje lagre informasjon utan å ha tilhøyrande data.

Døme: Vi tilset ein ny lærar, Jon Hauge, som skal undervise i historie. Men vi kan ikkje leggje han inn i tabellen utan å òg ha ein elev og ein karakter, fordi alle kolonnane er i same tabell.

3. Slettingsanomali


Sletting av data fører til utilsikta tap av annan informasjon.

Døme: Viss vi slettar alle karakterrader for Liam (den einaste eleven i 10C med naturfagskarakter), mistar vi ikkje berre karakteren, men potensielt informasjonen om at Lise Vik underviser i naturfag.

Alle tre anomaliane skuldast det same grunnproblemet: data som logisk høyrer til ulike ting er blanda saman i éin tabell. Normalisering løyser dette ved å dele data inn i separate, spesialiserte tabellar.

Normalisering
Normalisering er ein steg-for-steg-prosess for å organisere data i ein relasjonsdatabase slik at redundans (unødvendig gjentaking av data) blir minimert og dataintegriteten bevart. Normaliseringsprosessen følgjer ein serie reglar kalla normalformer (NF). Kvar normalform byggjer på den førre og stiller strengare krav til tabellstrukturen. Dei tre første normalformene (1NF, 2NF og 3NF) er dei viktigaste og dekkjer dei fleste praktiske behov.

Ein tabell er i første normalform (1NF) når:

1. Alle kolonnar inneheld atomære verdiar (udelelege enkeltverdiar)
2. Det finst ingen gjentakande grupper eller kolonnar
3. Kvar rad er unik (tabellen har ein primærnøkkel)

Døme: Brot med 1NF

elevidfornavnfag
1EmmaMatematikk, Norsk, Naturfag
2OliverMatematikk, Norsk

Kolonnen fag inneheld fleire verdiar i éi celle – det bryt med 1NF. Korleis finn du alle elevar som tek naturfag? Du kan ikkje bruke WHERE fag = 'Naturfag' fordi verdien er «Matematikk, Norsk, Naturfag».

Etter 1NF


elevidfornavnfag
1EmmaMatematikk
1EmmaNorsk
1EmmaNaturfag
2OliverMatematikk
2OliverNorsk

No har kvar celle berre éin verdi, og vi kan enkelt søkje:

SELECT fornavn FROM elever_fag WHERE fag = 'Naturfag';

Eit anna døme: Gjentakande kolonnar


elev_idfornavnfag1fag2fag3
1EmmaMatematikkNorskNaturfag
2OliverMatematikkNorskNULL

Dette bryt òg med 1NF – gjentakande kolonnar for fag. Kva viss ein elev tek fire fag? Då må vi leggje til ein ny kolonne. Løysinga er å dele opp i rader, som vist over.

Ein tabell er i andre normalform (2NF) når:

1. Han er i 1NF
2. Alle ikkje-nøkkelkolonnar er fullt funksjonelt avhengige av heile primærnøkkelen

2NF er relevant for tabellar med samansette primærnøklar (primærnøklar som består av to eller fleire kolonnar). Viss ein kolonne berre avheng av éin del av nøkkelen, bør han flyttast til ein eigen tabell.

Døme: Brot med 2NF

Tenk deg ein tabell for kursregistrering med samansett primærnøkkel (elevid + fagid):

elevidfagidelevnavnfagnavnkarakter
11EmmaMatematikk5
12EmmaNorsk4
21OliverMatematikk3

Primærnøkkel: (elevid, fagid)
Problem: elevnavn avheng berre av elev_id (ikkje av heile nøkkelen). fagnavn avheng berre av fag_id. Berre karakter avheng av heile nøkkelen (elevid + fagid).

Etter 2NF – del opp i tre tabellar:


elever:

elevidelevnavn
1Emma
2Oliver

fag:

fagidfagnavn
1Matematikk
2Norsk

karakterer:

elevidfagidkarakter
115
124
213

No avheng alle kolonnar av heile primærnøkkelen i sin respektive tabell. Elevnamn blir lagra berre éin gong, og fagnamn blir lagra berre éin gong.

Ein tabell er i tredje normalform (3NF) når:

1. Han er i 2NF
2. Ingen ikkje-nøkkelkolonne er avhengig av ein annan ikkje-nøkkelkolonne (ingen transitive avhengigheiter)

Med andre ord: alle ikkje-nøkkelkolonnar avheng direkte av primærnøkkelen, ikkje indirekte via andre kolonnar.

Døme: Brot med 3NF

elevidfornavnetternavnpostnummerpoststed
1EmmaHansen0150Oslo
2OliverJohansen0150Oslo
3NoraOlsen5003Bergen

Problem: poststed avheng av postnummer, som igjen avheng av elev_id. Dette er ei transitiv avhengigheit: elevid → postnummer → poststed. Poststad avheng ikkje direkte av elevid.
Konsekvensen er at «Oslo» blir lagra to gonger (for postnummer 0150). Viss postnummer 0150 byter namn, må vi oppdatere alle rader.

Etter 3NF – skil ut poststader:


elever:

elevidfornavnetternavnpostnummer
1EmmaHansen0150
2OliverJohansen0150
3NoraOlsen5003

poststeder:

postnummerpoststed
0150Oslo
5003Bergen

No blir kvar poststad lagra berre éin gong, og alle ikkje-nøkkelkolonnar avheng direkte av primærnøkkelen i sin respektive tabell.

📜Oppsummering av normalformene
1NF – Atomære verdiar: Alle kolonnar inneheld berre enkeltverdiar, ikkje lister eller grupper. Kvar rad er unik.

2NF – Full funksjonell avhengigheit: Alle ikkje-nøkkelkolonnar avheng av heile primærnøkkelen, ikkje berre ein del av han. (Relevant ved samansette primærnøklar.)

3NF – Ingen transitive avhengigheiter: Alle ikkje-nøkkelkolonnar avheng direkte av primærnøkkelen, ikkje av andre ikkje-nøkkelkolonnar.

Hugseregel: «Nøkkelen, heile nøkkelen, og ingenting anna enn nøkkelen.»
- 1NF: Dataa har ein nøkkel (primærnøkkel, atomære verdiar)
- 2NF: Avheng av heile nøkkelen (ikkje delar av samansett nøkkel)
- 3NF: Ingenting anna enn nøkkelen (ingen transitive avhengigheiter)

✏️Døme: Fullstendig normalisering av ein bibliotekdatabase
Utgangspunkt: Unormalisert tabell

utlaan_idelevnavnklasseboktittelforfatterisbnutdatoinndato
1Emma Hansen10ASofies verdenJostein Gaarder978-82-03-192024-09-012024-09-15
2Emma Hansen10ABeatlesLars S. Christensen978-82-02-252024-09-10NULL
3Oliver Johansen10ASofies verdenJostein Gaarder978-82-03-192024-09-052024-09-20

Problem:
- Namnet og klassen til Emma blir gjentekne (redundans)
- «Sofies verden» med forfattar og ISBN blir gjenteke (redundans)
- elevnavn er ikkje atomært (fornamn + etternamn i éin kolonne) → bryt 1NF

Steg 1: 1NF – atomære verdiar
Del elevnavn i fornavn og etternavn. Fjern gjentakande data.
Steg 2: 2NF og 3NF – fjern partielle og transitive avhengigheiter

CREATE TABLE elever (
    elev_id INTEGER PRIMARY KEY AUTOINCREMENT,
    fornavn TEXT NOT NULL,
    etternavn TEXT NOT NULL,
    klasse TEXT
);

CREATE TABLE boker (
    bok_id INTEGER PRIMARY KEY AUTOINCREMENT,
    tittel TEXT NOT NULL,
    forfatter TEXT,
    isbn TEXT UNIQUE
);

CREATE TABLE utlaan (
    utlaan_id INTEGER PRIMARY KEY AUTOINCREMENT,
    elev_id INTEGER NOT NULL,
    bok_id INTEGER NOT NULL,
    utlaans_dato DATE NOT NULL,
    innleverings_dato DATE,
    FOREIGN KEY (elev_id) REFERENCES elever(elev_id),
    FOREIGN KEY (bok_id) REFERENCES boker(bok_id)
);

-- Sett inn data
INSERT INTO elever (fornavn, etternavn, klasse) VALUES
    ('Emma', 'Hansen', '10A'),
    ('Oliver', 'Johansen', '10A');

INSERT INTO boker (tittel, forfatter, isbn) VALUES
    ('Sofies verden', 'Jostein Gaarder', '978-82-03-19'),
    ('Beatles', 'Lars S. Christensen', '978-82-02-25');

INSERT INTO utlaan (elev_id, bok_id, utlaans_dato, innleverings_dato) VALUES
    (1, 1, '2024-09-01', '2024-09-15'),
    (1, 2, '2024-09-10', NULL),
    (2, 1, '2024-09-05', '2024-09-20');

No er dataa normaliserte: elevinformasjon blir lagra berre éin gong, bokinformasjon blir lagra berre éin gong, og utlånstabellen koplar dei saman.

Normalisering er generelt ein god praksis, men det finst situasjonar der ein medvite vel å denormalisere – altså tillate noko redundans:

Ytingsomsyn


Normaliserte databasar krev mange JOIN-operasjonar for å setje saman data frå fleire tabellar. I system med ekstremt mange spørjingar (som sosiale medium med millionar av brukarar) kan dette bli ein flaskehals. Då kan ein medvite duplisere noko data for å unngå dyre JOIN-operasjonar.

Rapportering og analyse


For rapporterings-databasar (datavarehus) er det vanleg å bruke «flate» tabellar med noko redundans, fordi det gjer spørjingane enklare og raskare.

Enkle system


For svært enkle system med lite data kan full normalisering gjere ting unødvendig komplisert.

Hovudregelen er: Start alltid med normalisering. Denormaliser berre viss du har dokumenterte ytingsproblem som ikkje kan løysast på andre måtar. Det er mykje lettare å denormalisere ein normalisert database enn å normalisere ein rotete ein.

📝Oppgave 6.5.1

Kva er normalisering i databasesamanheng?

📝Oppgave 6.5.2

Denne tabellen bryt med første normalform (1NF). Kvifor?

elev_idfornavnhobbyer
1EmmaFotball, Lesing, Sjakk
2OliverGaming, Fotball

📝Oppgave 6.5.3

Kva type anomali oppstår i dette scenarioet?

Du har ein tabell der elevnamn og klasse blir lagra saman med karakterar. Emma Hansen er i klasse 10A og har tre karakterrader. Du oppdaterer klassen til 10B i to av radene, men gløymer den tredje.

📝Oppgave 6.5.4

Denne tabellen er unormalisert. Identifiser kva normalformer han bryt med, og vis korleis du normaliserer han til 3NF.

bestillingidkundenavnkundeepostproduktprisantalltotalpris
1Emma Hansenemma@mail.noUSB-kabel792158
2Emma Hansenemma@mail.noMus2991299
3Oliver Johansenoliver@mail.noUSB-kabel793237

📝Oppgave 6.5.5

Kva normalform bryt denne tabellen med?

ansattidnavnavdelingavdelingsleder
1Kari NordliMatematikkPer Haugen
2Lise VikNaturfagTom Bakke
3Jon HaugeMatematikkPer Haugen

Primærnøkkel: ansatt
id. Avdelingsleiar avheng av avdeling (ikkje direkte av ansatt_id).

📝Oppgave 6.5.6

Design ein fullstendig normalisert database (3NF) for eit treningssenter. Systemet skal handtere:

- Medlemmer (namn, telefon, e-post, medlemstype)
- Treningsklassar (namn, skildring, varigheit, instruktør)
- Påmeldingar til klassar (medlem, klasse, dato, tidspunkt)
- Instruktørar (namn, spesialisering, telefon)

Teikn eller skildr tabellane med kolonnar, primærnøklar, framandnøklar og relasjonstypar. Skriv deretter CREATE TABLE-kode for alle tabellane.

📝Oppgave 6.5.7

Kva er hugseregelen for dei tre første normalformene?

Oppsummering

I dette kapittelet har du lært:

- Normalisering: organiserer data for å unngå redundans.
- Anomaliar: oppdaterings-, innsettings- og slettingsanomali.
- 1NF: atomære verdiar, ingen gjentakande grupper.
- 2NF: ingen delvis avhengigheit av samansett nøkkel.
- 3NF: ingen transitiv avhengigheit.

Nøkkelomgrep


OmgrepForklaring
NormaliseringÅ organisere data for å minimere redundans
1NFAtomære verdiar i kvar kolonne
3NFIngen transitiv avhengigheit

Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.