Kapittel 4 · Forelesning 7–9 · Lærebok 6.1–6.9, 7.1–7.3, 7.6

Relasjonsdatabasedesign

Fra virkeligheten via et ER-diagram til et normalformet skjema — uten redundans, uten anomali, uten oppdateringskaos.

01 · Helhetsbilde

Hvorfor bry seg om design

Et dårlig databaseskjema lager det samme problemet om og om igjen: samme faktum lagres flere steder, oppdateringer lekker ut av synkronisering, og du klarer ikke registrere viktig informasjon før noen helt annen rad er på plass. Resultatet kalles anomali — og det er ikke en bugg du kan rette i applikasjonskoden, det er en strukturell svakhet i selve skjemaet.

Sentral idé

Design er ikke et estetisk valg. Det er et matematisk spørsmål: kan jeg representere alle gyldige situasjoner uten redundans, uten å miste informasjon, og uten å måtte sjekke regler på tvers av tabeller?

Konseptuelt
ER-diagram. Tegn problemet før du skriver tabeller. Snakker med stakeholders.
Logisk
Relasjonsskjema. Konkrete tabeller med kolonner, nøkler og fremmednøkler.
Mekanisk
Normalformer. Bevisbare garantier for at ingen redundansmønstre slipper gjennom.
02 · Designreisen

Fra virkelighet til BCNF

Hele kapittelet kan tegnes som én pil — men hvert pilhopp har sine egne regler og sine egne fallgruver.

Virkelighet krav, regler ER-diagram 4A · konsept 6.1–6.6 Tabeller 4B · logisk 6.7, 6.9, 7.1 FD-analyse 4C · normaler 7.2–7.3 BCNF 7.6 tegn reduser analyser dekomponer Hvert hopp er mekanisk — fallgruver kommer av å hoppe over et trinn.
Designreisen: konseptuell modell → logisk skjema → normalisert skjema.
Pensum-mapping

F7 dekker ER-modellen (lærebok 6.1–6.6). F8 dekker reduksjon til skjema, designproblemer og motivasjon for normalformer (6.7, 6.9, 7.1). F9 dekker funksjonelle avhengigheter, dekomponering og BCNF (7.1–7.3, 7.6).

04 · Sjekkliste

Du mestrer kapittel 4 når du kan…

  • tegne et ER-diagram for et naturlig språk-krav, inkludert svake entiteter
  • oversette diagrammet til et relasjonsskjema med riktige primær- og fremmednøkler
  • identifisere oppdaterings-, innsettings- og sletteanomalier i et gitt skjema
  • liste opp de funksjonelle avhengighetene og beregne lukningen X⁺
  • avgjøre om et gitt skjema er i 3NF eller BCNF — og begrunne det
  • dekomponere et ikke-BCNF-skjema lossless og forklare hva man eventuelt taper i dependency preservation

Sluttquiz · Test helheten

Tretti spørsmål på tvers av 4A, 4B og 4C — noen er grunnleggende, andre krever at du kombinerer begreper (normalformer, lukning, ER-oversettelse). Klikk på svaralternativene — riktig svar låser oppgaven; feil kan du prøve igjen.

Spørsmål 1 · Lett · ER-modellen
Hva skiller en svak entitet fra en sterk entitet?
En svak entitet trenger eierens nøkkel + en diskriminator for å skille instanser. Den tegnes med dobbel ramme i ER-diagrammet.
Spørsmål 2 · Middels · ER → tabell
For en N:M-relasjon mellom Student og Emne i et ER-diagram, hvordan oversettes denne best til relasjonsskjema?
N:M kan ikke representeres med fremmednøkkel på «den ene siden» — det finnes ingen «en» side. Mellomtabellen er den eneste lossless løsningen.
Spørsmål 3 · Lett · Anomali
Et tabellskjema lagrer instruktørens lønn og avdelingsbudsjett i samme rad. Hva er hovedrisikoen?
Redundans er ikke i seg selv ulovlig — problemet er at konsistens må håndheves manuelt for hver oppdatering. Det er den klassiske oppdateringsanomalien.
Spørsmål 4 · Middels · FD
Hvilken FD holder på relasjonsskjemaet Bil(regnr, modell, eier_pnr, eier_navn), gitt at hver bil har én eier og hvert personnummer hører til én person?
regnr er superkey, så regnr bestemmer alt. eier_pnr bestemmer eier_navn fordi personnummer er unikt. Eier_navn → eier_pnr holder ikke (flere personer kan hete det samme).
Spørsmål 5 · Vanskelig · Lukning
Gitt R(A,B,C,D) med FD-mengde F = {A→B, B→C, C→D}. Hva er lukningen {A}⁺?
Start med {A}. A→B gir B, så {A,B}. B→C gir C, så {A,B,C}. C→D gir D, så {A,B,C,D}. Siden lukningen er hele R, er A en supernøkkel.
Spørsmål 6 · Middels · BCNF
Et skjema er i BCNF hvis…
BCNF er definert i termer av FD-er og supernøkler. Atomaritet er 1NF. 3NF tillater visse FD-er som BCNF nekter (når β−α ligger i en kandidatnøkkel).
Spørsmål 7 · Vanskelig · Lossless join
Vi splitter R(A,B,C,D) i R₁(A,B) og R₂(B,C,D). FD-mengden er {B→C, C→D}. Er dekomposisjonen lossless?
Test: R₁ ∩ R₂ = {B}. Beregn {B}⁺ = {B, C, D}, som dekker R₂. Da er {B} supernøkkel for R₂, og dekomposisjonen er lossless.
Spørsmål 8 · Middels · 3NF vs BCNF
Hvorfor velger man av og til 3NF i stedet for BCNF?
Trade-off-en: BCNF eliminerer mer redundans, men når en FD ikke kan «holdes» i én tabell etter dekomponering, går dependency preservation tapt. 3NF beholder alle FD-er.
Spørsmål 9 · Middels · Anomali
Hvilken anomali oppstår når man ikke får lagt inn en ny avdeling fordi det ennå ikke finnes ansatte i den?
Innsettingsanomali = det vi ønsker å lagre, kan ikke uttrykkes uten å lyve om noe annet (eller fylle inn null). Symptom på at avdelings-fakta er smeltet inn i ansattes tabell.
Spørsmål 10 · Vanskelig · Kandidatnøkler
Gitt R(A,B,C,D,E) med FD-er {AB→C, C→D, D→E}. Hvilket sett er kandidatnøkkel?
{A,B}⁺ = {A,B,C,D,E} via AB→C, C→D, D→E. {A}⁺={A} dekker ikke alt. {A,B,C} er supernøkkel men ikke minimal — C kan fjernes.
Spørsmål 11 · Vanskelig · Designvalg
Du har et 3NF-skjema som taper dependency preservation hvis du dekomponerer videre til BCNF. Hva er den faglig beste avveiningen?
Lærebokas anbefaling: gå for BCNF når mulig, fordi SQL likevel bare kan håndheve nøkkel-FD-er effektivt — så «mistet» dependency preservation ville ha vært en illusjon i 3NF også.
Spørsmål 12 · Vanskelig · 4NF og MVD
Skjemaet inst_info(id, child_name, phone) registrerer barn og telefonnumre for forelesere. Det finnes ingen ikke-trivielle FD-er. Hvilken normalform oppfyller skjemaet, og hva er løsningen hvis det er problematisk?
Hele attributtmengden er nøkkel, så alle FD-er har trivielt supernøkkel som venstreside → BCNF. Men kryssproduktet av barn og telefoner gir redundans — fanges av MVD-er som ikke har supernøkkel-venstreside, altså brudd på 4NF. Splitt på MVD-en for å eliminere kryssproduktet.
Spørsmål 13 · Middels · Deltakelse → SQL
I ER-diagrammet er deltakelsen fra Ansatt til relasjonen JobberI total (dobbel linje). Hva blir den naturlige SQL-konsekvensen for fremmednøkkelen som peker til Avdeling?
Total deltakelse = instansen delta i relasjonen. Ved 1:N med FK på ansatt-siden betyr det at FK til avdeling ikke kan være usatt.
Spørsmål 14 · Veldig vanskelig · Lukning og kandidatnøkler
R(A, B, C, D, E) med F = {AB → C, C → D, D → A, BD → E}. Hvor mange kandidatnøkler har R, og hvilke er de?
B er aldri på høyresiden av en FD, så B må være med i hver kandidatnøkkel. Test parene: {A,B}⁺ = {A,B,C,D,E} via AB→C, C→D, BD→E ✓. {B,C}⁺ = {B,C,D,A,E} via C→D, D→A, BD→E ✓. {B,D}⁺ = {B,D,A,E,C} via D→A, BD→E, AB→C ✓. {B,E}⁺ = {B,E} — ingen FD utløses → ikke supernøkkel. Resultat: 3 kandidatnøkler.
Spørsmål 15 · Middels · 1:N
Relasjonen HarAnsatt er 1:N mellom Avdeling (1-siden) og Ansatt (N-siden). Hvor plasseres fremmednøkkelen i relasjonsskjemaet (uten mellomtabell)?
På N-siden kan hver rad bare ha én FK-verdi; den representerer «hvilken én-entitet» denne mange-siden tilhører. Derfor havner avdelings-nøkkelen i Ansatt.
Spørsmål 16 · Vanskelig · Min/max-notasjon
Kanten fra Kunde til Bestiller er merket (0, *), og kanten fra Ordre til Bestiller er (1, 1). Hva beskriver dette?
Les (min, max) på hver entitets kant. Ordre (1,1) = hver ordre deltar nøyaktig én gang → én kunde. Kunde (0,*) = en kunde kan ha 0–∞ ordrer. Det er 1:N fra Kunde til Ordre.
Spørsmål 17 · Veldig vanskelig · Minimal cover
F = {A → BC, AB → D, B → C, AC → D}. Hva er en minimal cover Fc av F?
Steg 1 — dekomponer høyresider: {A→B, A→C, AB→D, B→C, AC→D}. Steg 2 — fjern overflødige attributter på venstresider: AB→D blir A→D (siden A alene gir B via A→B, og dermed AB-konsekvensen). AC→D blir A→D (siden A alene gir C via A→B, B→C). Steg 3 — fjern overflødige FD-er: A→C er overflødig (A→B + B→C). Resultat: {A→B, B→C, A→D}.
Spørsmål 18 · Middels · Armstrong
Du har allerede bevist X → Y. Hvilken av Armstrongs grunnaksiomer brukes for å utlede XZ → YZ?
Augmentasjon: fra X → Y legger vi til samme attributter på begge sider og får XZ → YZ.
Spørsmål 19 · Vanskelig · 2NF
Når er et relasjonsskjema automatisk i 2NF (gitt at det er i 1NF)?
2NF handler om partiell avhengighet av en del av en sammensatt kandidatnøkkel. Hver kandidatnøkkel er enkel → tomt sett av slike brudd → trivelt 2NF.
Spørsmål 20 · Vanskelig · 3NF vs BCNF (klassiker)
R(A,B,C,D) med FD-er {AB→C, AB→D, C→A}. Kandidatnøkler er {A,B} og {B,C}. Hvilken normalform er R i?
C→A har venstreside som ikke er supernøkkel ({C}⁺ = {C,A}), men A er prime (del av {A,B}) — da oppfyller FD-en 3NF-unntaket, men bryter BCNF.
Spørsmål 21 · Middels · Lossless join
R(A,B,C) med F = {A→B, B→C}. Vi splitter i R₁(A,B) og R₂(B,C). Er dekomposisjonen lossless?
Lukning: {B}⁺ = {B,C} = R₂. Skjæringen er supernøkkel for ett av delskjemaene → lossless. (NB: dependency preservation følger også her — bonus — men hovedpoenget er lukningstesten.)
Spørsmål 22 · Veldig vanskelig · 3NF vs. BCNF i praksis
R(A, B, C, D, E) med F = {A → BC, CD → E, B → D, E → A}. Hvilken normalform er R i?
Beregn lukninger: {A}⁺ via A→BC, B→D, CD→E gir hele R; {E}⁺ via E→A gir hele R; {CD}⁺ via CD→E gir hele R. Kandidatnøkler: {A}, {E}, {CD}. FD-en B → D: {B}⁺ = {B,D} — B er ikke supernøkkel, så BCNF brytes. Men D er med i kandidatnøkkelen {C,D}, så D er prime — 3NF tolererer dette via «β−α er i en kandidatnøkkel»-unntaket.
Spørsmål 23 · Vanskelig · BCNF-brudd
TaEmne(student, emne, lærer) med FD-er {(student, emne) → lærer; lærer → emne} (én lærer underviser bare ét emne). Hvilken FD bryter BCNF?
(student, emne) er supernøkel-venstreside. Men lærer → emne: {lærer}⁺ gir bare lærer og emne, ikke student — så den FD-en forårsaker klassisk BCNF-brudd.
Spørsmål 24 · Middels · Avledet vs lagret
Hvorfor lagrer man normalt ikke et derivert attributt sammen med basis-attributtene det kommer fra?
Redundans + potensiell inkonsistens er kjernen. (Materialiserte/ genererte kolonner kan brukes bevisst, men da er det et bevisst designvalg.)
Spørsmål 25 · Vanskelig · Minimal cover
Hvorfor beregnes en minimal cover (F_c) før 3NF-syntese i lærebøker?
3NF-syntese: lag tabeller fra minimerte FD-er; uten minimering får du overflødige eller overlappende tabeller som ikke reflekterer en ren syntese.
Spørsmål 26 · Middels · Prime-attributt
Et attributt er prime hvis…
Prime = kan være del av noen minimal supernøkkel, ikke bare den valgte PK-en.
Spørsmål 27 · Vanskelig · Relasjon med attributter
ER-relasjonen Registrert mellom Student og Emne er M:N og har attributtet karakter. Hvor havner karakter i relasjonsskjemaet?
Attributter på relasjonstypen følger alltid «relasjonens tabell» — ved M:N er det mellomtabellen.
Spørsmål 28 · Vanskelig · Multivaluert × 1NF
Tabellen Student har kolonnen hobby der hver rad inneholder komma-separert liste («fotball, sjakk»). Hva er problemet i normalform-språk?
Kommaseparert liste er klassisk «ikke-atomær celle». Egentlig ønsker man StudentHobby(student, hobby).
Spørsmål 29 · Middels · Fremmednøkkel
En fremmednøkkel i tabell T refererer typisk til…
Referansiell integritet: FK-verdier må matche en eksisterende rad i mål-tabellen — standard er PK, alternativt UNIQUE constraint.
Spørsmål 30 · Vanskelig · Flere kandidatnøkler
Bruker har kandidatnøklene {fnr}, {epost} og {brukerid}. Hvor mange primærnøkler kan tabellen ha i SQL?
Kandidatnøkkel ≠ PRIMARY KEY: du velger én PK; øvrige kandidatnøkler får UNIQUE NOT NULL-constraints.
06 · Kapittel-eksamen

Flashcards — hele kapittelet i kortform

44 kort som tester ER-modellering, oversettelse til relasjonsskjema, anomalier, funksjonelle avhengigheter, lukning, kandidatnøkler og normalformer (1NF–BCNF). Klikk kortet for å snu det. Bruk piltastene til å bla, S for å shuffle, eller R for å resette rekkefølgen. Mestrer du alle disse, har du forstått kapittel 4 fra første til siste linje — og er klar for den delen av eksamen.

Tastatur: forrige · neste · Enter/Space snu · S shuffle · R reset
1 / 0
Kap. 4A — ER-modellen Lett

Hva er forskjellen på en entitet og en entitetstype?

En entitet er et konkret objekt vi vil lagre data om — f.eks. studenten "Knut Moen" med fnr 17059812345.

En entitetstype er klassen eller skjemaet for like entiteter — f.eks. Student som mal for alle studenter.

I ER-diagrammer tegner vi typer, ikke individuelle entiteter — rektangler representerer entitetstyper, og hver tabell i relasjonsskjemaet svarer til én entitetstype. Tilsvarende: i SQL er CREATE TABLE Student typen, hver rad er en entitet.

Pensum: Kap. 4A — Entiteter og attributter

Kap. 4A — Attributter Middels

Forklar forskjellen mellom enkle, komposite, flerverdi- og deriverte attributter — og hvordan hver tegnes.

Enkelt: én atomær verdi (alder, fnr). Tegnes som ovalt med enkel ramme.

Komposit: består av flere subattributter — Adresse → (gate, postnr, by). Tegnes som ovalt med subovaler hengende på.

Flerverdi: kan ha flere verdier per entitet (en person har flere telefonnumre). Tegnes med dobbel ramme. Kan ikke ligge direkte i tabellen — krever egen tabell ved oversettelse.

Derivert: kan beregnes ut fra annet (Alder fra Fødselsdato). Tegnes med stiplet ramme. Lagres typisk ikke — beregnes ved spørring for å unngå redundans.

Pensum: Kap. 4A — Attributter

Kap. 4A — Nøkler Middels

Forklar forskjellen på supernøkkel, kandidatnøkkel og primærnøkkel.

Supernøkkel: en attributtmengde som unikt identifiserer en entitet. Trenger ikke være minimal.

Kandidatnøkkel: en minimal supernøkkel — fjerner du en attributt, mister du unikheten.

Primærnøkkel: den kandidatnøkkelen designeren velger. Får PRIMARY KEY i DDL og blir mål for fremmednøkler. Ofte basert på praktiske kriterier (kortest, mest stabil).

Eksempel: i Bruker(fnr, epost, brukerid, navn) der alle tre første er unike — supernøkler inkluderer {fnr}, {epost}, {fnr, navn}, {fnr, epost, brukerid}; kandidatnøkler er {fnr}, {epost}, {brukerid}; primærnøkkel velger man én av disse tre.

Forhold: PK ⊂ kandidatnøkler ⊂ supernøkler.

Pensum: Kap. 4A — Nøkler

Kap. 4A — Kardinalitet Lett

Hva betyr 1:1, 1:N og M:N kardinalitet, og hvorfor er dette avgjørende for tabellstrukturen?

1:1: Hver entitet på én side er knyttet til høyst én på den andre. (En person ↔ ett pass.)

1:N: En 1-side kan være knyttet til mange N-er, men hver N kobles til høyst én 1-er. (En avdeling har mange ansatte; hver ansatt har én avdeling.)

M:N: Begge sider kan ha mange. (Studenter ↔ Emner.)

Hvorfor det betyr noe ved oversettelse: 1:1 og 1:N kan løses med en fremmednøkkel-kolonne. M:N krever en mellomtabell — det er ingen "én side" å plassere FK-en på.

Pensum: Kap. 4A — Relasjoner og kardinalitet

Kap. 4A — Deltakelse Middels

Hva er total versus partiell deltakelse, og hvordan tegnes hver?

Total deltakelse (obligatorisk): hver entitet i settet delta i relasjonen. Tegnes med dobbel linje mellom entitet og relasjon.

Partiell deltakelse (valgfri): noen entiteter kan stå utenfor relasjonen. Tegnes med enkel linje.

Eksempel: Hvis hver Ansatt MÅ jobbe i en Avdeling, er Ansatt-siden total. Hvis en Avdeling KAN være tom, er Avdeling-siden partiell.

Konsekvens for skjema: total deltakelse oversettes til NOT NULL på fremmednøkkelen. Partiell tillater null-verdier.

Pensum: Kap. 4A — Deltakelse

Kap. 4A — Svake entiteter Middels

Hva kjennetegner en svak entitet, og hvordan identifiseres dens instanser?

En svak entitet har ingen egen primærnøkkel — den kan ikke identifiseres alene. Den «låner» nøkkelen fra en eier-entitet (sterk entitet) gjennom en identifiserende relasjon (tegnet med dobbel diamant).

For å skille svake entiteter med samme eier brukes en diskriminator (delnøkkel). Primærnøkkelen blir {eierens PK, diskriminator}.

Eksempel: Avhengig(navn) er en svak entitet eid av Ansatt. Avhengighetens identitet er (Ansatt.fnr, navn) — to ansatte kan ha avhengige med samme navn, men ingen ansatt har to avhengige med samme navn.

I ER-diagrammet: dobbel ramme rundt entiteten, og deltakelsen mot eieren er alltid total.

Pensum: Kap. 4A — Svake entiteter

Kap. 4A — Min/max-notasjon Middels

I et ER-diagram er kanten fra Ansatt til JobberI merket (1,1), og kanten fra Avdeling til JobberI merket (0, *). Hva betyr dette?

  • A Hver ansatt jobber i nøyaktig én avdeling; en avdeling kan ha 0 eller flere ansatte.
  • B Hver ansatt jobber i ingen eller én avdeling; hver avdeling har minst én ansatt.
  • C Hver ansatt har minst én avdeling, og hver avdeling minst én ansatt.
  • D JobberI er en M:N-relasjon.

Riktig: A.

(min, max)-notasjonen leses som: hver entitet på denne siden må delta i mellom min og max instanser av relasjonen.

(1,1) på Ansatt-siden = total deltakelse + maks 1 → hver ansatt jobber i nøyaktig én avdeling. (0, *) på Avdeling-siden = partiell deltakelse + ubegrenset → en avdeling kan ha 0 eller mange ansatte. Sum: 1:N med total deltakelse fra Ansatt-siden.

B snur betydningen av (1,1) og (0,*). C antar total fra begge sider — feil siden Avdeling har min=0. D er feil — siden Ansatt har max=1, kan dette ikke være M:N.

Pensum: Kap. 4A — Notasjon for kardinalitet

Kap. 4A — Identifiserende relasjon Middels

Hva er en identifiserende relasjon, og hvor i ER-diagrammet tegnes den?

En identifiserende relasjon kobler en svak entitet til sin eier. Den er nødvendig fordi den svake entiteten henter halvparten av primærnøkkelen sin (eierens nøkkel) gjennom relasjonen.

I ER-diagrammet tegnes den som en dobbel diamant. Deltakelsen fra svak side er alltid total — hadde det ikke vært en eier, kunne den svake entiteten heller ikke eksistert (eksistens-avhengighet).

Ved oversettelse blir den identifiserende relasjonen ikke en egen tabell — den er allerede uttrykt gjennom FK-en i den svake entitetens tabell.

Pensum: Kap. 4A — Svake entiteter

Kap. 4A — Designmotivasjon Lett

Hvorfor bruker man tid på ER-modellering før man skriver SQL DDL?

(1) Kommunikasjon. ER-diagram er et språk stakeholders forstår uten å være DBA. Det er enklere å validere modellens regler ("én ansatt jobber alltid i én avdeling, ja?") enn DDL.

(2) Strukturell tenkning. Du tvinges til å skille entitet (eget identitetsobjekt) fra attributt (egenskap) fra relasjon (kobling). Hopper man over, ender man ofte med en bred tabell som blander.

(3) Mekanisk oversettelse. Når ER er ferdig og normalisert, er DDL nesten avskrivning — hvert valg om svake entiteter, kardinalitet og deltakelse er allerede gjort.

Resultatet: færre iterasjoner og bedre normalisert resultat.

Pensum: Kap. 4 — Hvorfor design

Kap. 4B — Map sterk entitet Lett

Hvordan oversettes en sterk entitet med atomære attributter til en tabell?

Lag én tabell med samme navn som entiteten. Én kolonne per atomært attributt. Primærnøkkelen blir entitetens primærnøkkel.

Eksempel: Student med fnr (PK), navn, fødselsdato → Student(fnr, navn, fødselsdato).

Komposite attributter «flatpakkes» — Person med Adresse(gate, postnr, by) gir kolonnene gate, postnr, by direkte i Person-tabellen, ikke en samletekst.

Flerverdi-attributter må bli en egen tabell (se eget kort) — de kan ikke ligge inni hovedtabellen uten å bryte 1NF.

Pensum: Kap. 4B — Sterke entiteter

Kap. 4B — Map flerverdi-attributt Middels

Hvordan oversettes et flerverdi-attributt, og hvorfor kan det ikke ligge direkte i hovedtabellen?

Et flerverdi-attributt blir en egen tabell med to kolonner: FK til eier-entiteten + selve verdien. PK = kombinasjonen.

Eksempel: Student(fnr, navn) med flerverdi-attributtet Telefon:

Student(fnr, navn)
StudentTelefon(fnr [FK→Student], telefon)

Hvorfor: 1NF tillater ingen multi-set-celler. En kolonne med {tlf1, tlf2, tlf3} bryter atomaritet. Å duplisere studentraden per telefon ville gitt redundans i navn/fnr og åpnet for oppdateringsanomali.

Pensum: Kap. 4B — Attributter

Kap. 4B — Map M:N relasjon Middels

Hvorfor MÅ en M:N-relasjon mellom A og B representeres som en egen mellomtabell — hvorfor kan vi ikke bare legge en FK i A-tabellen?

I M:N kan en A peke på flere B-er, og en B peke på flere A-er. En enkelt FK-kolonne kan kun lagre én verdi per rad — det dekker bare 1:N.

Den eneste lossless representasjonen er en junction table (mellomtabell) med to FK-kolonner og kombinasjonen som primærnøkkel:

Student M:N Emne → StudentTarEmne(fnr [FK→Student], emnekode [FK→Emne], semester, karakter)

Eventuelle attributter på selve relasjonen (semester, karakter) plasseres i mellomtabellen — de hører ikke hjemme i Student eller Emne alene.

Pensum: Kap. 4B — Relasjoner

Kap. 4B — Map 1:1 relasjon Vanskelig

Du har en 1:1-relasjon Eier mellom Person og Pass. Total fra Pass-siden (hvert pass tilhører nøyaktig én person), partiell fra Person-siden (en person har 0 eller 1 pass). Hvordan bør relasjonen oversettes?

  • A Lag en mellomtabell PersonHarPass(fnr, passnr).
  • B Slå sammen Person og Pass til én tabell.
  • C Legg fnr som NOT NULL FK i Pass-tabellen, med UNIQUE constraint.
  • D Legg passnr som FK i Person-tabellen.

Riktig: C.

Tommelfingerregel: i 1:1 plasseres FK-en på siden som har total deltakelse. Da garanterer NOT NULL at FK-en faktisk peker, og UNIQUE sikrer at ingen person har flere pass.

A er overkill — ingen redundans å unngå, og en mellomtabell kompliserer joins. B fjerner skillet og bryter 3NF hvis Person har attributter som ikke hører til Pass. D ville krevd at FK-en kan være null (siden ikke alle personer har pass), og er konseptuelt mer rotete enn C — men ville fungere teknisk hvis vi godtok null + UNIQUE-på-not-null.

Pensum: Kap. 4B — Relasjoner

Kap. 4B — Map svak entitet Middels

Hvordan oversettes en svak entitet til en tabell?

Tabellen får:

• Eierens primærnøkkel (FK + del av PK).
• Diskriminatoren (også del av PK).
• Alle attributter på den svake entiteten.

PK = {eierens PK, diskriminator}. FK-en mot eieren markeres typisk ON DELETE CASCADE for å reflektere eksistens-avhengigheten.

Eksempel: Avhengig(ansatt_fnr [FK→Ansatt], navn, fødselsdato, relasjon).

Den identifiserende relasjonen blir ikke en egen tabell — den er allerede uttrykt gjennom FK-en i den svake entitetens tabell.

Pensum: Kap. 4B — Svake entiteter

Kap. 4B — Helhetlig modellering Vanskelig

Du modellerer biblioteket. En Bok har ISBN, tittel, forfatter. Et Eksemplar har et hyllenummer; et eksemplar kan ikke eksistere uten en bok det er et eksemplar av. Hvilket tabelldesign er korrekt?

  • A Bok(ISBN, tittel, forfatter, hyllenr)
  • B Bok(ISBN, tittel, forfatter); Eksemplar(eks_id, hyllenr)
  • C Bok(ISBN, tittel, forfatter); Eksemplar(ISBN [FK→Bok], kopinr, hyllenr) med PK (ISBN, kopinr)
  • D Bok(ISBN, hyllenr); Eksemplar(ISBN, tittel, forfatter)

Riktig: C.

Eksemplar er en svak entitet — eier=Bok, diskriminator=kopinr. Mappes til en tabell med eierens nøkkel (ISBN) + diskriminator (kopinr) som sammensatt PK + svake attributter (hyllenr). FK på ISBN bør ha ON DELETE CASCADE.

A: kollapser alt til én tabell — bryter 1NF/3NF (én bok kan ha mange eksemplarer; hyllenr blir flerverdi). B: gjør Eksemplar til sterk entitet med kunstig nøkkel og taper eksistens-avhengigheten — eks_id sier ingenting om koblingen til Bok. D: blander attributter feil — tittel/forfatter hører til Bok, hyllenr til Eksemplar.

Pensum: Kap. 4B — Svake entiteter

Kap. 4B — Anomalier Lett

Beskriv de tre klassiske anomaliene (innsetting, sletting, oppdatering) med ett eksempel hver.

I et dårlig skjema Ansatt(fnr, navn, avd_navn, avd_budsjett):

Innsettingsanomali: Vil legge inn ny avdeling som ennå ikke har ansatte → kan ikke uten falsk Ansatt-rad eller null på fnr (som er PK).

Sletteanomali: Sletter siste ansatt i en avdeling → informasjonen om avdelingens budsjett forsvinner med raden.

Oppdateringsanomali: Endrer du budsjettet, må alle ansatte-rader oppdateres samtidig. Glemmer du én, blir tabellen inkonsistent.

Løsning: del i Ansatt(fnr, navn, avd_id) + Avdeling(avd_id, navn, budsjett). Hvert faktum lagres nøyaktig ett sted.

Pensum: Kap. 4B — Anomalier

Kap. 4B — Redundans Middels

Å lagre samme faktum flere steder er ikke ulovlig — så hvorfor regnes det som en designfeil?

(1) Konsistensbyrde: Du må sørge for at alle kopier oppdateres samtidig. SQL gir ingen automatisk garanti — hver UPDATE må eksplisitt oppdatere alle kopiene.

(2) Anomalier: Innsetting krever dummy-data, sletting taper informasjon, oppdatering kan glemme rader.

(3) Plass: Sekundært. Disk er billig, men store, repetisjonstunge tabeller laster bufferet og senker spørringer.

Normalisering eliminerer redundans ved å spalte tabeller slik at hvert ikke-key-faktum lagres bare én gang. Resultatet: integritet håndheves strukturelt (av skjemaet) i stedet for prosedyralt (av applikasjonskoden).

Pensum: Kap. 4B — Motivasjon for normalisering

Kap. 4C — Funksjonell avhengighet Lett

Hva betyr X → Y (funksjonell avhengighet) på et relasjonsskjema?

For ethvert lovlig forekomst av relasjonen: hvis to rader er like på X-attributtene, er de også like på Y-attributtene. Det er en constraint på dataene — uavhengig av aktuelle innstanser.

FD-er stammer fra reglene i den modellerte verden, ikke fra konkrete data. Du kan ikke lese dem ut av en eksempeltabell — du må vite hva som holde.

Eksempel: I Bil(regnr, modell, eierfnr, eier_navn) holder:
regnr → modell, eierfnr (regnr identifiserer bilen unikt)
eierfnr → eier_navn (personnummer er unikt per person)

Men ikke eier_navn → eierfnr — flere personer kan hete det samme.

Pensum: Kap. 4C — Funksjonelle avhengigheter

Kap. 4C — Trivielle FD-er Middels

Når er en FD triviell, og hvorfor er det viktig å skille triviell fra ikke-triviell?

En FD X → Y er triviell hvis Y ⊆ X. Den følger automatisk av definisjonen og gir ingen informasjon om relasjonen.

Eksempel: AB → A er triviell. AB → AC er delvis triviell (delen AB → A) men ikke fullstendig triviell.

En ikke-triviell FD er X → Y der minst én attributt i Y ikke er med i X — f.eks. AB → C der C ikke er i AB.

Hvorfor det betyr noe: alle definisjoner av normalformer (3NF, BCNF) krever bare at ikke-trivielle FD-er tilfredsstilles. Hvis vi krevde alle FD-er, ville BCNF være umulig — trivielle FD-er finnes overalt.

Pensum: Kap. 4C — FD-er

Kap. 4C — Armstrongs aksiomer Vanskelig

List opp Armstrongs tre grunnaksiomer for FD-er, og forklar hva hver av dem sier.

Tre regler som er fullstendige (kan utlede alle gyldige FD-er) og sunne (utleder bare gyldige):

1. Refleksivitet: Hvis Y ⊆ X, så X → Y. (Trivielle FD-er holder alltid.)

2. Augmentasjon: Hvis X → Y, så XZ → YZ. (Begge sider kan utvides med samme attributter.)

3. Transitivitet: Hvis X → Y og Y → Z, så X → Z. (FD-er kan kjedes.)

Avledede regler (utledet fra aksiomene, men praktiske):

Union: X→Y, X→Z ⊢ X→YZ
Dekomposisjon: X→YZ ⊢ X→Y, X→Z
Pseudotransitivitet: X→Y, WY→Z ⊢ WX→Z

Aksiomene danner basis for lukningsalgoritmen {X}⁺.

Pensum: Kap. 4C — Armstrongs aksiomer

Kap. 4C — Lukning Vanskelig

Gitt R(A,B,C,D,E) og FD-mengden F = {A→B, BC→D, D→E}. Hva er {A,C}⁺?

  • A {A, C}
  • B {A, B, C}
  • C {A, C, D, E}
  • D {A, B, C, D, E}

Riktig: D — {A, B, C, D, E}.

Iterativ algoritme: start med X⁺ = {A, C}, anvend FD-er til fix-punkt.

1. Start: {A, C}.
2. A → B: A er i settet → legg til B. Nå {A, B, C}.
3. BC → D: BC er i settet → legg til D. Nå {A, B, C, D}.
4. D → E: D er i settet → legg til E. Nå {A, B, C, D, E}.
5. Ingen flere FD-er kan utvides — fix-punkt nådd.

Siden lukningen er hele R, er {A, C} en supernøkkel.

A: glemmer å bruke FD-er. B: stopper etter A→B og overser at BC→D nå er bruksbar. C: hopper over A→B og prøver å bruke BC→D før vi har B.

Pensum: Kap. 4C — Lukning

Kap. 4C — Kandidatnøkkel-test Middels

Hvordan tester du om en attributtmengde X er en kandidatnøkkel for relasjonen R med FD-mengde F?

To krav som begge må gjelde:

1. Supernøkkel: {X}⁺ = R (hele attributtmengden). X bestemmer alt.

2. Minimal: for hver delmengde Y ⊊ X, {Y}⁺ ≠ R. Du kan ikke fjerne noen attributt fra X uten å miste supernøkkel-egenskapen.

Algoritme:
• Beregn {X}⁺. Hvis ikke = R → ikke engang supernøkkel, ferdig.
• Ellers, prøv å fjerne hver attributt fra X i tur. Hvis lukningen fortsatt = R, var den attributten redundant — kandidatnøkkelen er mindre.

For å finne alle kandidatnøkler: identifiser attributter som aldri står på høyre side av en FD — de må være med i hver kandidatnøkkel.

Pensum: Kap. 4C — Supernøkler og kandidatnøkler

Kap. 4C — Finn kandidatnøkler Vanskelig

R(A,B,C,D) med FD-er {A→B, B→C, C→D}. Hvor mange kandidatnøkler finnes?

  • A 0 — det finnes ingen supernøkkel.
  • B 1 — bare {A}.
  • C 2 — {A} og {B}.
  • D 4 — alle enkelt-attributter.

Riktig: B — bare {A}.

Beregn {A}⁺ = {A,B,C,D} via A→B→C→D. A er supernøkkel, og siden den bare har én attributt er den minimal — altså kandidatnøkkel.

Sjekk de andre: {B}⁺ = {B, C, D} (mangler A); {C}⁺ = {C, D}; {D}⁺ = {D}. Ingen er supernøkkel.

Triks: A står aldri på høyresiden av en FD — derfor må A være med i enhver kandidatnøkkel. Siden {A} alene er supernøkkel, kan ingen større mengde være kandidatnøkkel (de blir ikke-minimale).

A: feil — {A} er supernøkkel. C: feil — {B} er ikke supernøkkel. D: feil av samme grunn.

Pensum: Kap. 4C — Kandidatnøkler

Kap. 4C — Minimal cover Vanskelig

Hva er en minimal cover (kanonisk dekning) av en FD-mengde, og hvorfor regner man den ut?

En minimal cover F_c er en FD-mengde ekvivalent med F (samme lukning av enhver attributtmengde) men strippet:

1. Hver høyreside er én attributt (X → A, ikke X → AB).
2. Ingen FD i F_c er redundant (kan fjernes uten å endre lukningen).
3. Ingen attributt på venstresiden er overflødig (kan fjernes fra X uten å miste FD-en).

Hvorfor: 3NF-syntese-algoritmen krever en minimal cover som input. Den lager én tabell per FD i F_c og garanterer da dependency preservation. Uten minimering ville man fått overflødige tabeller.

Algoritmens trinn: (1) splitt høyresider, (2) fjern overflødige LHS-attributter, (3) fjern redundante FD-er. Rekkefølgen betyr noe — annen rekkefølge kan gi en annen, men ekvivalent, minimal cover.

Pensum: Kap. 4C — Dekomponering

Kap. 4C — 1NF Lett

Hva betyr at et skjema er i 1NF?

Alle attributter i hver rad inneholder atomære (udelelige) verdier — ingen lister, sett eller nestede strukturer.

Eksempel på 1NF-brudd: en kolonne telefoner = "12345, 67890" (kommaseparert liste) eller kompetanse = ['SQL', 'Python'] (array). Hvert datum må stå i egen rad eller egen kolonne med atomær verdi.

I praksis: hvis du må parse innholdet i en celle for å få ut den faktiske verdien, er du ikke i 1NF.

1NF er fundamentet — alle høyere normalformer forutsetter 1NF. Relasjonsmodellen som sådan bygger på 1NF; multiset-kolonner finnes ikke i den.

Pensum: Kap. 4C — Normalstigen

Kap. 4C — 2NF Middels

Hva betyr 2NF, og hvilket problem løser det som 1NF ikke gjør?

2NF: 1NF + ingen partiell avhengighet av et ikke-prime attributt på en del av en sammensatt kandidatnøkkel.

Konkret: hvis kandidatnøkkelen er sammensatt (f.eks. {A, B}) og det finnes en FD A → C der C er ikke-prime, så er C partielt avhengig av nøkkelen — det bryter 2NF.

Problem som 2NF løser: hvis (StudentID, EmneKode) er nøkkel og StudentNavn avhenger bare av StudentID, gjentas StudentNavn for hver emneregistrering — redundans og oppdateringsanomali.

Spesialtilfelle: hvis alle kandidatnøkler er enkle (én attributt), er skjemaet automatisk i 2NF — det finnes ingen "del av nøkkelen" å være partiell mot.

I praksis: vi går oftest direkte fra 1NF til 3NF/BCNF. 2NF er en pedagogisk mellomstasjon.

Pensum: Kap. 4C — Normalstigen

Kap. 4C — 3NF Middels

Definer 3NF. Hvilket problem fanger 3NF som 2NF ikke fanger?

For hver ikke-triviell FD X → A i F gjelder minst ett av:

1. X er en supernøkkel, ELLER
2. A er medlem av en kandidatnøkkel (et "prime attribute").

3NF stopper det 2NF ikke fanger: transitive avhengigheter mellom ikke-nøkkel-attributter, selv når kandidatnøkkelen er enkel.

Eksempel: Ansatt(fnr, navn, avd_id, avd_navn) med FD-er fnr → avd_id, avd_id → avd_navn. avd_id er ikke-supernøkkel og avd_navn er ikke-prime — så fnr → avd_navn er transitiv via avd_id, og det bryter 3NF (selv om kandidatnøkkelen {fnr} er enkel og 2NF er oppfylt).

Løsning: dele i Ansatt(fnr, navn, avd_id) + Avdeling(avd_id, navn).

Pensum: Kap. 4C — Normalstigen

Kap. 4C — BCNF Middels

Definer BCNF, og forklar hva som skiller den fra 3NF.

For hver ikke-triviell FD X → Y som holder, må X være en supernøkkel. Det er den eneste regelen — uten 3NFs unntak for prime-attributter.

Forskjellen: 3NF tillater X → A der A er en del av en kandidatnøkkel, selv om X ikke er supernøkkel. BCNF tillater det ikke.

Klassisk eksempel: R(student, emne, lærer) med FD-er {(student, emne) → lærer; lærer → emne}. Kandidatnøkler: {student, emne} og {student, lærer}. lærer → emne bryter BCNF (lærer er ikke supernøkkel) men oppfyller 3NF (emne er prime).

Konsekvens: BCNF eliminerer mer redundans enn 3NF, men kan tape dependency preservation ved dekomponering.

Pensum: Kap. 4C — BCNF

Kap. 4C — Identifiser brudd Vanskelig

R(A,B,C,D) med FD-er {AB→C, AB→D, C→A}. Kandidatnøkler: {A,B} og {B,C}. Hvilken normalform er R i?

  • A Bare 1NF
  • B 2NF, men ikke 3NF
  • C 3NF, men ikke BCNF
  • D BCNF

Riktig: C — 3NF, men ikke BCNF.

Sjekk hver FD:

AB → C: AB er supernøkkel ✓ (BCNF OK)
AB → D: AB er supernøkkel ✓ (BCNF OK)
C → A: {C}⁺ = {C, A}, ikke = R. C er ikke supernøkkel → BCNF-brudd. For 3NF: A er prime (medlem av {A,B}) → 3NF tilfredsstilt.

Skjemaet er altså i 3NF (alle FD-er har enten supernøkkel-LHS eller prime-RHS) men ikke BCNF (C → A bryter). Dette er nettopp det klassiske 3NF/BCNF-gapet.

A: 1NF brytes ikke (alle attributter er atomære). B: krever ikke-prime LHS som er del av sammensatt nøkkel — ikke aktuelt her. D: feil pga C→A.

Pensum: Kap. 4C — BCNF

Kap. 4C — BCNF-dekomponering Vanskelig

R(student, emne, lærer, lærer_kontor) med FD-er {(student, emne) → lærer; lærer → lærer_kontor}. Hva er en lossless BCNF-dekomponering?

  • A R₁(student, emne, lærer), R₂(lærer, lærer_kontor)
  • B R₁(student, emne), R₂(emne, lærer, lærer_kontor)
  • C R₁(student, emne, lærer_kontor), R₂(lærer, lærer_kontor)
  • D Skjemaet er allerede i BCNF.

Riktig: A.

Kandidatnøkkel: {student, emne}. {student, emne}⁺ = {student, emne, lærer, lærer_kontor}. FD lærer → lærer_kontor: lærer er ikke supernøkkel for R → BCNF-brudd.

Dekomp på lærer→lærer_kontor: skill ut R₂(lærer, lærer_kontor). Igjen i R₁(student, emne, lærer): (student, emne) → lærer holder, og (student, emne) er supernøkkel for R₁. R₁ er BCNF.

Lossless: R₁ ∩ R₂ = {lærer}; {lærer}⁺ = {lærer, lærer_kontor} = R₂ → supernøkkel for R₂ ✓

B: dropper lærer fra R₁ — taper FD (student, emne)→lærer; ikke lossless. C: blander attributter feil — lærer mangler i R₁. D: feil, lærer→lærer_kontor bryter BCNF.

Pensum: Kap. 4C — Dekomponering

Kap. 4C — Lossless join Middels

Hva er lossless join-vilkåret for en dekomposisjon R = R₁ ∪ R₂?

Dekomponeringen er lossless hvis FD-mengden inneholder minst én av:

(R₁ ∩ R₂) → (R₁ \ R₂), eller
(R₁ ∩ R₂) → (R₂ \ R₁)

Med ord: skjæringen mellom de to skjemaene må være supernøkkel for minst ett av dem.

Test:
1. Beregn R₁ ∩ R₂ = mengden felles attributter.
2. Beregn lukningen (R₁ ∩ R₂)⁺ over hele FD-mengden.
3. Hvis lukningen dekker R₁ eller R₂, er joinen lossless.

Hvorfor: hvis X = R₁ ∩ R₂ er supernøkkel for f.eks. R₂, så har hver rad i R₂ en unik X-verdi, og join på X kan rekonstruere R uten "spurious tuples" (falske rekombinasjoner).

For 3+ delskjemaer brukes chase-algoritmen.

Pensum: Kap. 4C — Dekomponering

Kap. 4C — Lossless-test Vanskelig

R(A,B,C,D,E) splittes i R₁(A,B,C), R₂(C,D,E). FD-er: {A→B, C→D, D→E}. Er dekomposisjonen lossless?

  • A Ja — fordi A → B er en FD vi kan bevare.
  • B Ja — C er supernøkkel for R₂ siden C → D → E.
  • C Nei — fordi A→B ikke involverer skjæringen.
  • D Nei — vi har mistet attributtinformasjon.

Riktig: B — Ja, lossless.

Test: R₁ ∩ R₂ = {C}. Beregn {C}⁺ = {C, D, E} = R₂. C er supernøkkel for R₂ → lossless-vilkåret oppfylt.

Du trenger ikke at skjæringen er supernøkkel for begge — bare for én. Her er C ikke supernøkkel for R₁ (mangler A og B), men det spiller ingen rolle.

A: A→B er irrelevant for lossless-testen — kun skjæringen teller. C: korrekt at A→B ikke er relevant, men det medfører ikke nei. D: ingen attributter mistes; alle A,B,C,D,E finnes i R₁ ∪ R₂.

Pensum: Kap. 4C — Lossless join

Kap. 4C — Dependency preservation Vanskelig

Hva betyr dependency preservation, og hvorfor kan BCNF-dekomposisjon tape den?

En dekomponering bevarer FD-er hvis hver FD i den opprinnelige FD-mengden kan håndheves lokalt på ett av delskjemaene — uten å joine tilbake til full R.

Formelt: F₁ ∪ F₂ ∪ … ≡ F (lukningene er ekvivalente), der F_i = projeksjonen av F på R_i.

Hvorfor BCNF kan tape: når du dekomponerer for å fjerne et FD-brudd, kan du måtte splitte attributtene i en FD over to delskjemaer. Da kan FD-en ikke håndheves uten å rekonstruere R, og en INSERT på ett delskjema kan bryte den uten at noen tabell ser bruddet.

Klassisk eksempel: Klasse(student, emne, lærer) med F = {(student, emne) → lærer; lærer → emne}. BCNF-dekomp tvinger oss til å splitte slik at FD (student, emne) → lærer mistes som lokalt bevarbar.

3NF-syntese garanterer alltid både lossless OG dependency preservation. BCNF garanterer lossless, ikke alltid dependency preservation. Det er den klassiske trade-off-en.

Pensum: Kap. 4C — Trade-off

Kap. 4C — 3NF-syntese Vanskelig

Beskriv 3NF-syntese-algoritmen i hovedtrekk og hva den garanterer.

Algoritme:

1. Beregn en minimal cover F_c av F.
2. For hver FD X → A i F_c, lag en tabell {X, A}. Slå sammen FD-er med samme venstreside i samme tabell.
3. Hvis ingen tabell inneholder en kandidatnøkkel for R, legg til en tabell bestående av en kandidatnøkkel.
4. (Valgfritt) Fjern tabeller som er strikte delmengder av andre.

Garantier:

• Alle delskjemaer er i 3NF.
Lossless join.
Dependency preserving — alle FD-er i F kan håndheves lokalt.

Forskjellen fra BCNF-dekomp (som er en analyse-algoritme): 3NF-syntese gir alltid dependency preservation; BCNF gjør det ikke nødvendigvis.

Pensum: Kap. 4C — Dekomponering

Kap. 4C — Trade-off Middels

Når i praksis velger man 3NF over BCNF, og når går man for BCNF likevel?

Hvis et skjema er i 3NF men ikke BCNF, og BCNF-dekomp ville tape dependency preservation, så er valget:

Beholde 3NF: akseptere noe potensiell redundans for å sikre at alle FD-er kan håndheves lokalt (med f.eks. CHECK-constraints eller triggere). Bra hvis FD-en bryter ofte uten dekomp og du ikke vil bruke triggere som ser flere tabeller.

Gå til BCNF: eliminere redundans, men nå må FD-en som tapes håndheves med komplekse triggere som spenner over tabeller — ofte upraktisk og dyrt.

Læreboka anbefaler ofte BCNF i den grad SQL likevel ikke håndhever generelle FD-er effektivt — så «tapt dependency preservation» er mer en teoretisk ulempe enn en praktisk i mange tilfeller. Resultatet: BCNF-dekomp foretrekkes ofte i praksis.

3NF-syntese er likevel et trygt fallback når BCNF-bruddet er kostbart eller du har store triggerbyrder.

Pensum: Kap. 4C — 3NF vs BCNF

Kap. 4C — Klassifiseringsprosedyre Vanskelig

Du får et skjema R og en FD-mengde F. Hvilke trinn (i rekkefølge) tar du for å klassifisere normalformen?

1. List opp alle attributter i R og FD-er i F. Skriv FD-er på enkleste form (én attributt på høyre side om mulig).

2. Finn kandidatnøkler. Attributter som aldri står på høyre side må være med i hver kandidatnøkkel. Beregn lukninger og finn minimale supernøkler.

3. Identifiser prime-attributter (attributter som er medlem av minst én kandidatnøkkel).

4. Sjekk hver ikke-triviell FD X → A:

• Er X en supernøkkel? → tilfredsstiller BCNF (og dermed alt under).
• Hvis ikke, er A prime? → tilfredsstiller 3NF, men ikke BCNF.
• Hvis A ikke er prime, sjekk om X ⊊ K for en kandidatnøkkel K → 2NF-brudd. Ellers er det 3NF-brudd via transitiv avhengighet.

5. 1NF antas med mindre du ser tydelige multi-set-kolonner.

Konklusjonen er den laveste normalformen alle FD-er tilfredsstiller.

Pensum: Kap. 4C — Normalstigen

Kap. 4C — Lossless vs preserving Middels

Forklar forskjellen på lossless join og dependency preservation, og hvorfor begge er viktige.

Lossless join: garanterer at vi kan rekonstruere det opprinnelige skjemaet ved å joine delskjemaene — ingen rader oppfinnes, ingen tapes. Uten denne er dekomponeringen i praksis verdiløs: spørringer som krysser delskjemaer gir falske resultater.

Dependency preserving: garanterer at hver opprinnelig FD kan håndheves uten å joine. Uten denne kan en INSERT i ett delskjema bryte en FD som spenner over flere delskjemaer, og databasen blir inkonsistent uten at SQL ser det.

Lossless er obligatorisk. Dependency preservation er ønskelig, men kan ofres for BCNF.

3NF-syntese garanterer begge. BCNF-analyse garanterer lossless, ikke alltid dependency preservation.

Pensum: Kap. 4C — Trade-off

Kap. 4 — Nøkler og fremmednøkler Middels

Forklar forholdet mellom supernøkkel, kandidatnøkkel, primærnøkkel og fremmednøkkel.

Supernøkkel: enhver attributtmengde som unikt identifiserer rader. Ikke nødvendigvis minimal.

Kandidatnøkkel: minimal supernøkkel. Hver tabell kan ha flere.

Primærnøkkel: den valgte kandidatnøkkelen. SQL-konstrukt: PRIMARY KEY (én per tabell). Markerer NOT NULL og UNIQUE.

Fremmednøkkel (FK): en attributtmengde i tabell A som refererer til primærnøkkelen i tabell B. Sikrer referansiell integritet — verdien må enten være null eller matche en eksisterende rad i B.

Forhold: PK ⊆ kandidatnøkler ⊆ supernøkler. FK er ikke en nøkkel for sin egen tabell — den er en peker.

I ER → relasjon uttrykker FK relasjonen mellom entiteter.

Pensum: Kap. 4A — Nøkler

Kap. 4 — Valg av primærnøkkel Vanskelig

Bruker har kandidatnøklene {fnr}, {epost} og {brukerid}. Hva avgjør hvilken som velges som primærnøkkel?

Vurderingskriterier (i synkende viktighet):

1. Stabilitet: Endrer verdien seg sjelden? Epost kan endres → dårlig kandidat. fnr og brukerid endres aldri → bedre.

2. Kortsthet: En 4-byte heltallsnøkkel indekserer raskere enn en e-poststreng. Mindre cascade-trykk på FK-er.

3. Personvern: fnr er sensitivt — å bruke det som FK i mange tabeller sprer det. Et generert brukerid er ofte tryggere.

4. Garantert tilstedeværelse: PK må være NOT NULL. Hvis attributten kan være ukjent ved innsetting, kan den ikke være PK.

I praksis: ofte velges en surrogat-nøkkel (auto-økende heltall) som PK, og naturlige nøkler (fnr, epost) merkes som UNIQUE NOT NULL. Da har du fleksibilitet uten å miste integriteten.

Pensum: Kap. 4A — Nøkler

Kap. 4 — ER + FD = full design Middels

Hvilke FD-er er garantert å holde i et relasjonsskjema utledet fra ER, og hvilke må modelløren oppgi separat?

Automatisk (fra ER-strukturen):

• Primærnøkkelen til hver entitet bestemmer alle attributter på den entiteten.
• I et 1:N-relasjonsskjema (FK på N-siden) bestemmer N-sidens PK relasjonens attributter.

Modellører må oppgi (utenfor ER):

• FD-er mellom ikke-nøkkel-attributter — f.eks. postnr → by. ER-diagrammet sier ingenting om dette.
• FD-er som spenner over flere entiteter modellert som én tabell.
• Implisitte regler i domenet: "samme prosjekt har én leder", "samme avdeling har ett budsjett".

Disse «ekstra» FD-ene driver normaliseringsanalysen i 4C. Skriver du dem ikke ned, vil 3NF/BCNF-sjekken si "alt OK" — selv om skjemaet har redundans.

Lærdom: ER + FD-er sammen er det fullstendige bildet. ER alene er ikke nok.

Pensum: Kap. 4C — FD-er

Kap. 4C — Praktisk normalisering Vanskelig

R(prosjekt, ansatt, timer, prosjektleder) med FD-er {(prosjekt, ansatt) → timer; prosjekt → prosjektleder}. Hvilken normalform er R i?

  • A 1NF, men ikke 2NF
  • B 2NF, men ikke 3NF
  • C 3NF, men ikke BCNF
  • D BCNF

Riktig: A — 1NF, men ikke 2NF.

Kandidatnøkkel: {prosjekt, ansatt}. {prosjekt, ansatt}⁺ = R.

Sjekk FD-en prosjekt → prosjektleder: prosjekt er en del av kandidatnøkkelen {prosjekt, ansatt}, og prosjektleder er ikke-prime. Dette er en partiell avhengighet — bryter 2NF.

Konsekvens: prosjektleder gjentas for hver ansatt på samme prosjekt → oppdateringsanomali.

Løsning (3NF/BCNF-dekomp): R₁(prosjekt, ansatt, timer) + R₂(prosjekt, prosjektleder).

B/C/D: alle krever 2NF, som ikke er oppfylt.

Pensum: Kap. 4C — Normalstigen

Kap. 4C — Lukning til kandidatnøkkel Vanskelig

R(A,B,C,D,E) med FD-er {AB→C, C→D, D→E}. Hvilken er en kandidatnøkkel?

  • A {A}
  • B {A, B}
  • C {A, B, C}
  • D {C, D}

Riktig: B — {A, B}.

Beregn {A,B}⁺: start {A,B} → AB→C gir C → {A,B,C} → C→D gir D → {A,B,C,D} → D→E gir E → {A,B,C,D,E} = R. Supernøkkel ✓.

Minimalitet: {A}⁺ = {A} (ingen FD med kun A på venstre side); {B}⁺ = {B}. Ingen kan fjernes → {A,B} er minimal → kandidatnøkkel.

A: {A} alene er ikke supernøkkel. C: {A,B,C} er supernøkkel, men ikke minimal — C kan fjernes. D: {C,D}⁺ = {C,D,E}, mangler A og B, så ikke supernøkkel.

Triks: A og B står aldri på høyresiden av en FD — så de må være med i enhver kandidatnøkkel. Da er {A,B} det minste som har sjanse til å være supernøkkel.

Pensum: Kap. 4C — Supernøkler og kandidatnøkler

Kap. 4 — Helhetsbilde Middels

Forklar designreisen i fire trinn: fra virkelighet til BCNF. Hva gjør hvert trinn, og hvor i pensum ligger det?

1. Virkelighet → ER-diagram (4A, lærebok 6.1–6.6). Tegn entiteter, attributter, relasjoner, kardinalitet, deltakelse, svake entiteter. Kommunikasjon med stakeholder.

2. ER-diagram → relasjonsskjema (4B, 6.7+6.9). Mekaniske regler: én tabell per sterk entitet; FK-er for 1:1 og 1:N; mellomtabell for M:N; eierens PK + diskriminator for svake. Komposite "flatpakkes", flerverdi blir egne tabeller.

3. Skjema + FD-mengde → FD-analyse (4C, 7.1–7.2). List FD-er som holder i domenet. Beregn lukninger, finn kandidatnøkler. Identifiser prime/ikke-prime attributter.

4. FD-analyse → normalisert skjema (4C, 7.3+7.6). Sjekk 1NF/2NF/3NF/BCNF. Dekomponer der det finnes brudd — pass på lossless og dependency preservation.

Hvert hopp er mekanisk. Fallgruver kommer av å hoppe over et trinn.

Pensum: Kap. 4 — Designreisen