Forberedelse til kodeinterviews · Lektion

Normalisering til og med 3NF

Første, anden og tredje normalform samt de anomalier, de fjerner.

Lektion 1 af 413 trin

Normalisering til og med 3NF er en gratis Forberedelse til kodeinterviews-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Forberedelse til kodeinterviews, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Forberedelse til kodeinterviews-kurset indeholder 4 lektioner i alt.

Hvorfor interviewere spørger om normalisering

Normalisering er et grundlæggende princip i databasemodellering, og interviewere bruger det til at undersøge, om du forstår dataintegritet på struktureringsniveau. Spørgsmålet lyder ofte sådan: "Hvad er normalisering, og hvorfor er den vigtig?"

Normalisering er processen med at organisere kolonner og tabeller for at reducere redundans og forhindre opdaterings-, indsættelses- og sletningsanomalier. Hver normalform (1NF, 2NF, 3NF) tilføjer en strengere regel.

Et stærkt svar nævner de anomalier, som normalisering fjerner, ikke kun lærebogsdefinitionerne.

De tre anomalier

Før du ser på normalformerne, skal du lære de problemer, de løser. En dårligt udformet tabel, der gemmer alt ét sted, har tre anomalier:

  • Opdateringsanomali: Den samme oplysning gemmes i mange rækker, så en ændring skal foretages i dem alle, ellers bliver dataene inkonsistente.
  • Indsættelsesanomali: Du kan ikke tilføje en oplysning uden også at angive irrelevante data (f.eks. kan du ikke tilføje et produkt uden en ordre).
  • Sletningsanomali: Når du sletter én række, kommer du ved et uheld til at slette en anden uafhængig oplysning.

Hvis du kan finde disse problemer i en eksempeltabel, kan du begrunde hvert trin i normaliseringen.

En tabel uden normalisering

Her er et klassisk intervieweksempel: én bred tabel, der blander ordrer, kunder og produkter. Bemærk den gentagne kundemailadresse og produktpris på tværs af rækkerne. Det er her, anomalierne opstår.

Din opgave i interviewet er at føre denne tabel frem til 3NF og forklare hver opsplitning.

-- Unnormalized: everything in one table
CREATE TABLE orders_flat (
  order_id     INT,
  customer_id  INT,
  customer_email VARCHAR(255),
  product_id   INT,
  product_name VARCHAR(100),
  unit_price   DECIMAL(10,2),
  quantity     INT
);

Første normalform (1NF)

1NF kræver, at hver kolonne indeholder én enkelt atomær værdi, og at der ikke findes gentagne grupper eller arrays i en celle.

En tabel overtræder 1NF, hvis en kolonne gemmer en kommasepareret liste som 'phone1, phone2', eller hvis du har kolonnerne product1, product2, product3.

Løsningen er at give hver værdi sin egen række. Intervieweren vil høre dig sige "atomære værdier, ingen gentagne grupper og en nøgle, der identificerer hver række."

-- Violates 1NF: a list inside one column
-- phones = '555-1111, 555-2222'

-- 1NF fix: one phone per row
CREATE TABLE customer_phone (
  customer_id INT,
  phone       VARCHAR(20),
  PRIMARY KEY (customer_id, phone)
);

Funktionelle afhængigheder

For at forklare 2NF og 3NF skal du bruge udtrykket funktionel afhængighed. Vi skriver A -> B for at betyde "A bestemmer B": For hver værdi af A findes der præcis én værdi af B.

I vores ordretabel:

  • customer_id -> customer_email
  • product_id -> product_name, unit_price
  • order_id, product_id -> quantity

Normalisering handler i virkeligheden om at sikre, at hver ikke-nøglekolonne afhænger af hele nøglen og ikke andet end nøglen.

Anden normalform (2NF)

2NF gælder, når primærnøglen er sammensat. Den forbyder, at en ikke-nøglekolonne kun afhænger af en del af nøglen (en delvis afhængighed).

Nøglen for vores ordrelinje er (order_id, product_id). Men product_name og unit_price afhænger kun af product_id, ikke af hele nøglen. Det er en delvis afhængighed, så tabellen overtræder 2NF.

Løsningen er at flytte produktegenskaberne til en products-tabel med product_id som nøgle.

CREATE TABLE products (
  product_id   INT PRIMARY KEY,
  product_name VARCHAR(100),
  unit_price   DECIMAL(10,2)
);

CREATE TABLE order_items (
  order_id   INT,
  product_id INT,
  quantity   INT,
  PRIMARY KEY (order_id, product_id),
  FOREIGN KEY (product_id) REFERENCES products(product_id)
);

Tredje normalform (3NF)

3NF fjerner transitive afhængigheder: en ikke-nøglekolonne, der afhænger af en anden ikke-nøglekolonne i stedet for direkte af nøglen.

Antag, at en orders-tabel har customer_id samt customer_email. Her gælder order_id -> customer_id -> customer_email. E-mailadressen afhænger kun af nøglen via customer_id, hvilket er en transitiv afhængighed.

Løsningen er at placere kunderne i deres egen tabel. Nu afhænger hver tabels ikke-nøglekolonner kun af dens nøgle.

CREATE TABLE customers (
  customer_id    INT PRIMARY KEY,
  customer_email VARCHAR(255)
);

CREATE TABLE orders (
  order_id    INT PRIMARY KEY,
  customer_id INT,
  FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

Hjælp til at huske det i én linje

Interviewere elsker en kandidat, der kan opsummere 3NF i én sætning. Den klassiske formulering er:

"Hver ikke-nøglekolonne skal afhænge af nøglen, hele nøglen og ikke andet end nøglen."

  • Nøglen -> 1NF (der findes en nøgle, og værdierne er atomære).
  • Hele nøglen -> 2NF (ingen delvis afhængighed).
  • Ikke andet end nøglen -> 3NF (ingen transitiv afhængighed).

Denne ene linje gør det muligt at rekonstruere alle tre normalformer efter behov.

BCNF: Det opfølgende spørgsmål

En skarp interviewer spørger måske til Boyce-Codd-normalformen (BCNF), som er en strengere variant af 3NF.

BCNF kræver, at X for enhver funktionel afhængighed X -> Y skal være en supernøgle. 3NF tillader en sjælden undtagelse, når den afhængige attribut er en del af en kandidatnøgle; BCNF fjerner også denne undtagelse.

Du støder ikke ofte på overtrædelser af BCNF i praksis, men hvis du nævner den og siger "BCNF er 3NF uden undtagelser for nøgleattributter", viser du en dybere forståelse.

Hvornår du IKKE skal normalisere

Et svar på seniorniveau anerkender kompromiset. Normalisering forbedrer integriteten, men kan forringe læseydelsen, fordi en forespørgsel kræver flere sammenføjninger.

Bevidst denormalisering er acceptabel, når:

  • Arbejdsbelastningen er læsetung, og sammenføjningerne er flaskehalsen.
  • Du opbygger et analyse-/rapporteringslag (stjerneskemaer, som gennemgås senere).
  • Du kan holde den redundante kopi synkroniseret (triggere, ETL, materialiserede visninger).

Sig: "Normalisér for OLTP-integritet; denormalisér bevidst for OLAP-læsehastighed."

Gennemgang på tavlen

Sæt det hele sammen. I et liveinterview, når du får en rodet tabel:

  • Angiv kandidatnøglen, og opstil de funktionelle afhængigheder.
  • Kontrollér atomaritet og gentagne grupper (1NF).
  • Hvis nøglen er sammensat, skal du kontrollere, om der er delvise afhængigheder (2NF).
  • Kontrollér afhængigheder mellem ikke-nøglekolonner (3NF).
  • Tegn de resulterende tabeller med primær- og fremmednøgler.

At fortælle disse trin højt er præcis det, intervieweren bedømmer.

Hurtig kontrol

Kontrollér din forståelse af normalformerne.

Opsummering: Normalisering gennem 3NF

Du kan nu besvare det klassiske interviewspørgsmål om normalisering fra start til slut:

  • Normalisering fjerner opdaterings-, indsættelses- og sletningsanomalier ved at reducere redundans.
  • 1NF: atomære værdier, ingen gentagne grupper.
  • 2NF: ingen delvis afhængighed af en sammensat nøgle.
  • 3NF: ingen transitiv afhængighed mellem ikke-nøglekolonner.
  • Opsummér det som "nøglen, hele nøglen og ikke andet end nøglen."
  • BCNF strammer 3NF; denormalisér bevidst til læsetunge analyser.
Gratis at komme i gang

Lær Forberedelse til kodeinterviews med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
90
Lektioner
360

Ofte stillede spørgsmål

Er lektionen “Normalisering til og med 3NF” gratis?

Ja — hele teksten til “Normalisering til og med 3NF” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Forberedelse til kodeinterviews-kurset, skal du opgradere til CoddyKit PRO. Forberedelse til kodeinterviews-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Normalisering til og med 3NF”?

Første, anden og tredje normalform samt de anomalier, de fjerner. Du øver dig i Forberedelse til kodeinterviews med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Forberedelse til kodeinterviews?

Der kræves ingen tidligere erfaring. Forberedelse til kodeinterviews på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Normalisering til og med 3NF”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Forberedelse til kodeinterviews-lektion?

Ja. Alle Forberedelse til kodeinterviews-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Normalisering til og med 3NF
  2. ER-modellering og relationskardinalitet
  3. Stjerneskema og design af datavarehuse
  4. Komplet opgavesæt til prøveinterview
← Tilbage til Forberedelse til kodeinterviews