Forstå relasjonsdatabasemodellen, fremmednøkler, relasjonstyper og ER-diagrammer.
Limet som binder tabellene
Nå skal vi dykke dypere inn i relasjonsdatabasemodellen og se hvordan tabeller kobles sammen. God datamodellering er kanskje det viktigste du lærer om databaser: en velplanlagt database er lett å jobbe med og rask å søke i, mens en dårlig designet database gir dupliserte data, inkonsistens og ytelsesproblemer som er vonde å rette i etterkant. Derfor planlegger man alltid grundig før man lager tabeller.
Nøkkelbegrepet er fremmednøkkel. Det er en kolonne i én tabell som inneholder verdier som peker til primærnøkkelen i en annen tabell. Fremmednøkler er limet som holder databasen sammen – de oppretter koblinger mellom tabeller. De sikrer også referanseintegritet: databasen hindrer deg i å lage referanser til rader som ikke finnes. Du kan for eksempel ikke registrere en karakter for elev_id 99 hvis det ikke finnes noen elev med id 99.
Det finnes tre grunnleggende relasjonstyper. En-til-en (1:1) betyr at hver rad i tabell A er koblet til nøyaktig én rad i tabell B – som elev og elevkort. Denne er ganske sjelden. En-til-mange (1:N) er den vanligste: én rad i A kan kobles til mange i B, men hver rad i B til bare én i A. Én klasse har mange elever, men hver elev tilhører bare én klasse – og fremmednøkkelen klasse_id ligger på mange-siden, altså i elevtabellen.
Mange-til-mange og ER-diagrammer
Den tredje relasjonstypen er mange-til-mange (M:N): mange rader i A kan kobles til mange i B. En elev kan ha mange fag, og et fag kan ha mange elever. Denne kan ikke løses med bare én fremmednøkkel – den krever alltid en koblingstabell. Mellom elever og fag lager vi en tabell elev_fag som inneholder fremmednøkler til begge, og gjerne ekstra informasjon som karakter. Samme prinsipp gjelder hvis en forfatter kan skrive mange bøker og en bok kan ha flere forfattere: du oppretter en koblingstabell forfatter_bok. (Å lagre forfatternavn som kommaseparert tekst er en klassisk feil du skal unngå.)
Før du oppretter en database, bør du planlegge den visuelt med et ER-diagram (Entity-Relationship-diagram). Det viser entiteter (tingene vi lagrer informasjon om) som rektangler, attributter som egenskaper, og relasjoner som linjer mellom entitetene. Den mest brukte notasjonen heter kråkefotsnotasjon (Crow's Foot), der symbolene på linjene angir relasjonstypen: en strek (|) betyr nøyaktig én, en sirkel (O) betyr valgfri/null, og en kråkefot (<) betyr mange. Slik kan du lese rett ut av diagrammet at klasse og elev har en en-til-mange-relasjon, mens elev og fag har en mange-til-mange-relasjon via koblingstabellen.
Fra modell til tabeller
Når modellen er planlagt, oppretter du tabellene med SQL-kommandoen CREATE TABLE, der du definerer kolonner, datatyper og begrensninger:
CREATE TABLE elever (
elev_id INTEGER PRIMARY KEY AUTOINCREMENT,
fornavn TEXT NOT NULL,
etternavn TEXT NOT NULL,
klasse_id INTEGER,
FOREIGN KEY (klasse_id) REFERENCES klasser(klasse_id)
);Flere ting er verdt å merke. INTEGER PRIMARY KEY AUTOINCREMENT lager en primærnøkkel som automatisk øker med 1 for hver ny rad. TEXT NOT NULL betyr at kolonnen lagrer tekst og ikke kan være tom – feltet må alltid ha en verdi. Og FOREIGN KEY (klasse_id) REFERENCES klasser(klasse_id) oppretter fremmednøkkelen som kobler eleven til en klasse.
For koblingstabellen elev_fag bruker vi en sammensatt primærnøkkel:
CREATE TABLE elev_fag (
elev_id INTEGER,
fag_id INTEGER,
karakter INTEGER,
PRIMARY KEY (elev_id, fag_id),
FOREIGN KEY (elev_id) REFERENCES elever(elev_id),
FOREIGN KEY (fag_id) REFERENCES fag(fag_id)
);Her betyr PRIMARY KEY (elev_id, fag_id) at kombinasjonen av elev og fag må være unik – en elev kan ikke registreres på samme fag to ganger. Samme prinsipper bruker du til å modellere alt fra en skole til en nettbutikk med kunder, ordrer og produkter.
Oppsummering
Relasjonsdatabaser holdes sammen av fremmednøkler – kolonner som peker til primærnøkkelen i en annen tabell og sikrer referanseintegritet. De tre relasjonstypene er en-til-en, en-til-mange (vanligst, med fremmednøkkelen på mange-siden) og mange-til-mange, som alltid krever en koblingstabell.
Før du bygger, planlegger du med et ER-diagram i kråkefotsnotasjon, der strek betyr én, sirkel betyr valgfri og kråkefot betyr mange. Til slutt oppretter du tabellene med CREATE TABLE, der PRIMARY KEY AUTOINCREMENT, NOT NULL og FOREIGN KEY ... REFERENCES er de viktigste byggesteinene. God datamodellering nå sparer deg for mye hodebry senere.
Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.