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.
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).
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 JobberItotal (dobbel linje). Hva blir den naturlige SQL-konsekvensen for fremmednøkkelen som peker til Avdeling?
Total deltakelse = instansen må 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.
(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-modellenLett
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.
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.
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.
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å.
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.
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 svar: A
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.
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.
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.
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.
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.
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 svar: C
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.
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?
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.
Å 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.
(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).
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 må 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 ikkeeier_navn → eierfnr — flere personer kan hete det samme.
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.
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 svar: D
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.
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.
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 svar: B
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.
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.
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.
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.
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).
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 svar: C
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.
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 svar: A
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.
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).
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 svar: B
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₂.
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.
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.
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.
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.
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.
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.
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.
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.
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 svar: A
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.
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 svar: B
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.
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.