Kapittel 4 · 4B · Forelesning 8 · Lærebok 6.7, 6.9, 7.1

ER → relasjonsskjema

Mekaniske regler for å oversette diagram til tabeller — og hvor anomalien sniker seg inn hvis man slurver.

01 · Oversettelsesoppgaven

Diagram til tabeller

Et godt ER-diagram inneholder all informasjonen vi trenger for å lage et relasjonsskjema. Reglene er mekaniske: gjør X med entiteter, gjør Y med relasjoner, gjør Z med svake entiteter. Du skal ikke tenke kreativt under oversettelsen — den kreative delen var å lage diagrammet i første runde.

Mål for oversettelsen

Lossless — ingen informasjon tapes. Constraint-bevarende — primær- og fremmednøkler reflekterer kardinalitet og deltakelse. Effektiv — så få tabeller som mulig uten å miste det første.

Den korte oppskriften

  1. Hver sterk entitet → tabell.
  2. Hver svak entitet → tabell med sammensatt nøkkel som arves fra eieren.
  3. Hver fler-verdig attributt → egen tabell.
  4. Hver relasjon → fremmednøkkel-kolonne (1:1, 1:N) eller egen tabell (N:M).
  5. ISA-hierarkier → en av tre strategier (vi kommer til det).
02 · Sterke entiteter

Entitet blir tabell

For en sterk entitet E med atomære attributter a₁, a₂, …, aₙ der a₁ er nøkkel:

CREATE TABLE E (
  a1 PRIMARY KEY,
  a2 …,
  …
  an …
);

Eksempel: Student med (studnr, navn, fødselsdato) blir:

CREATE TABLE Student (
  studnr        INT PRIMARY KEY,
  navn          VARCHAR(100) NOT NULL,
  fodselsdato   DATE
);
Konvensjon

Kolonnenavn på engelsk eller norsk uten æøå er typisk i industrien for portabilitet. Lærebokas eksempler bruker engelsk, men på eksamen er norsk akseptabelt.

03 · Sammensatte og fler-verdige

Når et attributt ikke er atomært

Sammensatt attributt → flate kolonner

adresse(gate, postnr, sted) blir til tre flate kolonner:

CREATE TABLE Person (
  pnr            CHAR(11) PRIMARY KEY,
  adresse_gate   VARCHAR(120),
  adresse_postnr CHAR(4),
  adresse_sted   VARCHAR(60)
);

Fler-verdig attributt → egen tabell

Et attributt som tlf-numre kan ikke representeres som én kolonne (det ville bryte 1NF — atomaritet). Vi lager en egen tabell der nøkkelen er sammensatt av eier-entitetens nøkkel og attributtverdien:

CREATE TABLE Person_tlf (
  pnr      CHAR(11),
  tlf      VARCHAR(20),
  PRIMARY KEY (pnr, tlf),
  FOREIGN KEY (pnr) REFERENCES Person(pnr) ON DELETE CASCADE
);
Dette er ikke valgfritt

Komma-separerte verdier i én kolonne er klassisk anti-pattern. Det ødelegger indekser, sortering, joins og constraint-håndhevelse. Hver gang du fristes: tenk at databasen ble laget i 1970 nettopp for å unngå dette.

Sjekk · Lett
Hva blir primærnøkkelen i tabellen som kommer fra et fler-verdig attributt kompetanseAnsatt(ansattnr, …)?
Den sammensatte (ansattnr, kompetanse). Slik unngår man at samme kompetanse registreres dobbelt på samme person, samtidig som flere personer kan ha samme kompetanse og én person kan ha mange.
04 · Relasjoner: 1:1, 1:N, N:M

Relasjon → kolonne eller tabell

Beslutningsregelen

  • 1:1 — fremmednøkkel i én av tabellene. Velg den siden med total deltakelse (unngår nullverdier).
  • 1:N — fremmednøkkel på N-siden. Den ene siden av relasjonen får en kolonne som peker til den andre.
  • N:M — egen tabell med to fremmednøkler som sammen utgjør primærnøkkelen.
Student tar Emne N M karakter Student studnr (PK) navn StudentTarEmne studnr (FK→Student) emnekode (FK→Emne) karakter Emne emnekode (PK) tittel FK FK PK = (studnr, emnekode) Eksempelinstans studnr emnekode kar 100123 TDT4145 A 100123 TMA4115 B 100147 TDT4145 C 100201 TFY4106 A 100201 TMA4115 B én rad per (student, emne)-par
Steg 1 / 3
N:M med attributt på relasjonen reduseres til mellomtabell. Klikk gjennom trinnene.

1:N-eksempel: Avdeling har Ansatte

Ansatt-tabellen får en fremmednøkkel avd_id til Avdeling:

CREATE TABLE Ansatt (
  ansattnr  INT PRIMARY KEY,
  navn      VARCHAR(80),
  avd_id    INT NOT NULL,            -- total deltakelse
  FOREIGN KEY (avd_id) REFERENCES Avdeling(avd_id)
);
Hvorfor på N-siden?

Hadde Avdeling fått en kolonne ansatt_id, kunne kolonnen bare peke på én ansatt — men avdelinger har flere. Plassér FK på siden hvor det er maks én peker. Det er alltid N-siden i en 1:N.

Sjekk · MCQ
I en 1:1-relasjon mellom Person og Pass der hver person har ett pass og hvert pass har én eier — hvor plasseres fremmednøkkelen?
Plasser FK der den aldri kan være null. Pass må ha eier, så Pass.eier_pnr er den naturlige plasseringen.
05 · Svake entiteter

Identitet arves

Svake entiteter blir egne tabeller, men den primære nøkkelen er sammensatt: eierens nøkkel + diskriminatoren. Eierens nøkkel er samtidig fremmednøkkel.

CREATE TABLE Ordrelinje (
  ordrenr   INT,
  linjenr   INT,
  vare_id   INT NOT NULL,
  antall    INT NOT NULL,
  PRIMARY KEY (ordrenr, linjenr),
  FOREIGN KEY (ordrenr) REFERENCES Ordre(ordrenr) ON DELETE CASCADE,
  FOREIGN KEY (vare_id) REFERENCES Vare(vare_id)
);
ON DELETE CASCADE

Slettingsregelen følger semantikken: en svak entitet kan ikke eksistere uten eieren. Mister du ordren, slettes alle linjene automatisk. Det er konseptuelt riktig, og fjerner muligheten for «forelderløse» rader.

Sjekk · Middels
Hvorfor lager vi ikke en separat tabell for relasjonen Ordre — har — Ordrelinje når vi reduserer en svak entitet?
Fordi relasjonen er innebygd i Ordrelinje-tabellen. ordrenr-kolonnen er fremmednøkkelen, og samtidig en del av primærnøkkelen. En egen relasjonstabell ville være redundant — den ville bare kopiere allerede eksisterende informasjon.
06 · ISA-strategier

Tre alternativer for spesialisering

Det finnes ikke ett riktig svar — strategi velges ut fra hvor mange unike attributter subklassene har, og hvilke spørringer som er vanlige.

A
Én tabell for alt + diskriminatorkolonne. Felles og spesialiserte attributter ligger i samme rad. Spesialiserte attributter blir NULL for rader av annen type.
Bra når: få spesialiserte attributter, mye polymorfe spørringer. Dårlig når: mange unike kolonner per subtype → mange null-celler.
B
Tabell per konkret subtype. Ingen felles supertabell — hver subtype har sin egen tabell med både felles og spesialiserte attributter. Felles attributter dupliseres på kolonnenivå.
Bra når: total + disjoint, og du sjelden spør på tvers. Dårlig når: mye polymorfe spørringer (UNION ALL kreves).
C
Tabell per nivå (super- + subtabeller). Supertabellen har felles attributter; hver subtabell har bare egne attributter pluss FK til supertabellen.
Bra når: mange spesialiserte attributter, klar disjoint-struktur. Dårlig når: du leser på tvers ofte (krever join).
Strategi C — supertabell + subtabeller Person pnr (PK), navn Student pnr (PK,FK→Person) studieprogram Lærer pnr (PK,FK→Person) avdeling Administrator pnr (PK,FK→Person) kontor
Strategi C: hver subtabell deler primærnøkkel med supertabellen. pnr er både PK i subtabellen og FK til supertabellen.
Sjekk · MCQ
Et bibliotek skiller mellom Bok, Tidsskrift og DVD. Felles: katalognr, tittel, hyllenr. Bok har 50 attributter unike for bok; DVD har 3. Hvilken strategi er typisk best?
Strategi A ville gitt 50+ NULL-kolonner på hver DVD-rad. C unngår dette ved å plassere bok-attributter bare i Bok-tabellen, og holder felles attributter i Materiale.
07 · Gjennomarbeidet eksempel

Universitet → tabeller, helt

La oss kjøre gjennom et lite, men realistisk eksempel. Krav:

  • En Avdeling har et navn (unikt) og en bygning. Avdelingen kan eksistere uten ansatte.
  • En Lærer jobber i nøyaktig én avdeling. Lærere har lønn, navn, ansattnummer.
  • Hver lærer kan ha 0 eller flere telefonnumre.
  • Lærere underviser Emner. Et emne kan undervises av flere lærere; en lærer kan undervise flere emner. Per (lærer, emne)-par registreres et semester.
  • Pårørende til en lærer er en svak entitet. Identifiseres ved (lærer, navn). Vi lagrer relasjonstype.

Resulterende skjema

CREATE TABLE Avdeling (
  avd_navn  VARCHAR(60) PRIMARY KEY,
  bygning   VARCHAR(40)
);

CREATE TABLE Larer (
  ansattnr  INT PRIMARY KEY,
  navn      VARCHAR(80) NOT NULL,
  lonn      DECIMAL(10,2),
  avd_navn  VARCHAR(60) NOT NULL,        -- total deltakelse
  FOREIGN KEY (avd_navn) REFERENCES Avdeling(avd_navn)
);

CREATE TABLE Larer_tlf (                  -- fler-verdig attributt
  ansattnr  INT,
  tlf       VARCHAR(20),
  PRIMARY KEY (ansattnr, tlf),
  FOREIGN KEY (ansattnr) REFERENCES Larer(ansattnr) ON DELETE CASCADE
);

CREATE TABLE Emne (
  emnekode  CHAR(7) PRIMARY KEY,
  tittel    VARCHAR(100)
);

CREATE TABLE Underviser (                  -- N:M-relasjon med attributt
  ansattnr  INT,
  emnekode  CHAR(7),
  semester  CHAR(5),                       -- 'V2026' f.eks.
  PRIMARY KEY (ansattnr, emnekode, semester),
  FOREIGN KEY (ansattnr) REFERENCES Larer(ansattnr),
  FOREIGN KEY (emnekode) REFERENCES Emne(emnekode)
);

CREATE TABLE Parorende (                   -- svak entitet
  ansattnr  INT,
  pnavn     VARCHAR(80),
  relasjon  VARCHAR(30),
  PRIMARY KEY (ansattnr, pnavn),
  FOREIGN KEY (ansattnr) REFERENCES Larer(ansattnr) ON DELETE CASCADE
);
Sjekk hva vi gjorde

Sterke entiteter (Avdeling, Lærer, Emne) → egne tabeller. 1:N (Avdeling–Lærer) → FK på N-siden. Fler-verdig attributt → egen tabell. N:M med attributt → mellomtabell. Svak entitet → sammensatt PK + ON DELETE CASCADE. Total deltakelse → NOT NULL på FK.

08 · Designproblemer

Tre ansikter til anomali

Selv etter mekanisk reduksjon kan skjemaet ha problemer — typisk fordi ER-diagrammet har slått sammen entiteter som burde vært skilt. Tenk deg dette dårlige skjemaet:

InDep(id, navn, lonn, avd_navn, bygning, budsjett)

Vi har slått sammen Lærer og Avdeling. Hver rad gjentar bygning og budsjett for hver lærer i samme avdeling. La oss se hva som skjer:

Tabellen InDep — observer kolonnene merket gult
idnavnlønnavd_navnbygningbudsjett
10101Srinivasan65 000Comp.Sci.Taylor100 000
45565Katz75 000Comp.Sci.Taylor100 000
83821Brandt92 000Comp.Sci.Taylor100 000
22222Einstein95 000PhysicsWatson70 000
33456Gold87 000PhysicsWatson70 000
Oppdaterings­anomali
Endrer du Comp.Sci.-budsjettet, må du finne og endre alle tre rader. Glemmer du én → inkonsistens.
Innsettings­anomali
Vil registrere en helt ny avdeling Music? Du må fabrikkere en lærer (eller bruke NULL for id, navn, lønn) — for tabellen krever at hver rad har lærer-info.
Slette­anomali
Sletter du den siste læreren i Physics, mister du også (Physics, Watson, 70 000) — selv om Physics ennå eksisterer som avdeling.
Symptomet

Når samme faktum dukker opp gjentatt på flere rader, er det et tegn på at to konseptuelt forskjellige ting deler samme tabell. Løsningen er dekomponering — splitt i to tabeller og knytt dem med fremmednøkkel.

Dekomponert versjon

Larer-tabellen
idnavnlønnavd_navn
10101Srinivasan65 000Comp.Sci.
45565Katz75 000Comp.Sci.
22222Einstein95 000Physics
Avdeling-tabellen
avd_navnbygningbudsjett
Comp.Sci.Taylor100 000
PhysicsWatson70 000
MusicPackard80 000
Etter dekomponering

Hver avdeling har nøyaktig én rad med sitt budsjett. Ny avdeling registreres uten lærere. Sletter vi den siste Physics-læreren, ligger Physics fremdeles trygt i Avdeling-tabellen.

Sjekk · MCQ
Hvilken type anomali oppstår når du ikke får registrert et nytt fakta uten samtidig å lyve om noe annet?
«Få ikke lagt til avdeling før det finnes en lærer i den» er klassisk innsettingsanomali — også kalt insertion anomaly.
09 · Motivasjon for normalformer

Mekanisk diagnose

Anomalier er ikke tilfeldigheter. De er symptomer på spesifikke mønstre i avhengighetene mellom attributtene. Hvis vi kan beskrive avhengighetene formelt, kan vi bygge en algoritme som oppdager problemene før dataen kommer inn — og som forteller oss hvilken dekomponering som løser dem.

Det formelle språket heter funksjonelle avhengigheter (FD). En FD X → Y sier «hvis du vet X, kan du regne ut Y». I InDep-eksempelet:

  • id → navn, lonn, avd_navn — lærer-id bestemmer alt om læreren
  • avd_navn → bygning, budsjett — avdelingsnavnet bestemmer alt om avdelingen

Når den andre FD-en holder uten at avd_navn er supernøkkel for hele tabellen, har vi per definisjon et BCNF-brudd. Algoritmen for å splitte er mekanisk: «for hver FD α → β der α ikke er supernøkkel, splitt i (α ∪ β) og (R − (β − α))».

Forsmak på 4C

Det er i 4C — neste underkapittel — at vi setter formaliteten på papir: hva en FD er, hvordan vi beregner lukninger, hva som er forskjellen mellom 1NF, 2NF, 3NF og BCNF, og når vi taper dependency preservation.

Klar for 4C?

Gå videre til 4C → normalformer og lær det matematiske språket bak alt vi har observert i dette underkapittelet.