Hopp til innhold

Fagstoff

Relasjoner og kardinalitet

Hvis du har lagd har en datamodell med flere tabeller, må tabellene kobles sammen med en relasjon. En relasjon representerer da en kobling mellom de to tabellene og viser at de har noe til felles.
Kort sammendrag av animasjonen om relasjoner i databaser

Animasjonen viser en stor tabell med kolonner for personlig identitetsnummer, fornavn, etternavn, postnummer, poststed, idrett, idrettstype og spillernummer. Mye av informasjonen i tabellen henger naturlig sammen, for eksempel postnummer og poststed, og idrett og idrettstype. Det er derfor lurt å dele tabellen opp i flere mindre tabeller og koble disse sammen med relasjoner. Spesielt viktig er det at alle tabeller har en egen primærnøkkel. Primærnøklene er nødvendige for å kunne koble sammen tabellene i en database.

Tidligere har vi brukt eksempelet Bileier - Bil, der en bileier kan eie flere biler, mens en bil kun kan ha én eier.

Datamodell bileier-bil med en-til-mange-relasjon. Illustrasjon
Åpne bilde i et nytt vindu

Det finnes tre forskjellige typer relasjoner:

  • 1:1 – én-til-én-relasjon (brukes svært sjelden og vil ikke bli gjennomgått her)
  • 1:n - én-til-mange-relasjon
  • n:m - mange-til-mange-relasjon

Kardinalitet

De forskjellige typene relasjoner kalles kardinalitet. Kardinalitet deles opp i maksimumskardinalitet og minimumskardinalitet. I figuren over har hver side av relasjonen to symboler. Det symbolet som er nærmest tabellen (innerst) er maksimum, og det symbolet som er lengst unna tabellen (ytterst) er minimum. Symbolene som brukes er:

  • O – null (kun minimumskardinalitet)
  • | – én (minimums- og maksimumskardinalitet)
  • < og > (kråkefot) – mange (kun maksimumskardinalitet)

Når vi snakker om de tre typene relasjoner som nevnes over, er det maksimumskardinalitet vi snakker om. I relasjonen bileier-bil kan en bileier ha én eller flere biler, og en bil kan ha én og bare én eier.

Én-til-mange-relasjon

For å opprette en én-til-mange-relasjon i MySQL Workbench klikker du på verktøyet merket 1:n med stiplet linje.

Stiplet eller heltrukket linje?
Relasjonsverktøy. Illustrasjon.

Forskjellen på relasjoner med stiplet og heltrukket linje er om tabellene er det vi kaller svake entiteter eller ikke. En svak entitet er en tabell som kun kan eksistere i forbindelse med en annen tabell, tenk for eksempel på relasjonen mellom tabellene "Bygning" og "Rom": Et rom kan ikke eksistere uten at det er koblet til en bygning. Derfor er Rom en svak entitet, og her vil vi da bruke en heltrukket linje. Svake entiteter har alltid primærnøkkelen til den relaterte tabellen som en del av sin primærnøkkel (i kombinasjon med sin egen ID).

Det er bare i spesielle tilfeller vi bruker heltrukket linje, så som hovedregel kan du bruke stiplet linje overalt.

Merk at mange-til-mange-relasjoner kun finnes med heltrukket linje. Du skal lære mer om mange-til-mange-relasjoner lenger ned i denne artikkelen.

Så klikker du først på den tabellen som skal være mange-siden i relasjonen (Bil). Til slutt klikker du på tabellen som skal være én-siden i relasjonen (Bileier). Du vil da se at det dukker opp et ekstra attributt i Bil-tabellen. Dette attributtet er det samme som primærnøkkelen i Bileier, og kalles en fremmednøkkel.

Skjermbilde fra programmet MySQL Workbench. Animasjon

Minimumskardinalitet i én-til-mange-relasjoner

I relasjonen bileier-bil har du nå angitt at en bileier kan eie én eller flere biler. Men hva med om en bileier selger bilen sin og er uten bil i en periode? Da ønsker du fortsatt å beholde bileieren i databasen. Du må da gjøre noe med minimumskardinaliteten for å gjøre det mulig at en bileier ikke alltid må eie minst én bil. For å gjøre dette må du redigere relasjonen ved å dobbelklikke på linjen mellom tabellene Bileier og Bil. Du får da opp en ny fane som heter Relationship. I denne fanen klikker du på Foreign Key nederst på skjermen. Da får du se sidene i relasjonen og informasjon om kardinaliteten. Her går det også an å endre relasjonstypen.

Skjermbilde fra programmet MySQL Workbench

For å sette minimumskardinalitet til 0 må du fjerne haken fra feltet Mandatory i den siden av relasjonen der du ønsker endre minimumskardinaliteten, i dette tilfellet ved tabellen Bil (det er denne siden som angir at en bileier kan eie én eller flere biler). Når du har klikket bort haken fra Mandatory-feltet kan du klikke inne i tegnefeltet igjen. Du vil da se at 1-tallet ved tabellen Bil blir endret til 0. Du har nå angitt at en bileier kan eie null eller flere biler.

Datamodell bileier-bil med en-til-mange-relasjon og minimumskardinalitet satt til null.. Illustrasjon
Åpne bilde i et nytt vindu

Mange-til-mange-relasjon

Tenk deg en database som skal gi oversikt over en rekke filmer og hvilke skuespillere som er med i hver film. Da trengs en tabell for filmer og en tabell for skuespillere. En film kan ha mange skuespillere, og en skuespiller kan spille i mange filmer. Dette er et eksempel på en mange-til-mange-relasjon.

Datamodell skuespiller-film uten relasjon. Illustrasjon.
Åpne bilde i et nytt vindu

Når du skal lage en mange-til-mange relasjon i MySQL Workbench, klikker du på verktøyet merket med n:m. Så klikker du på hver av de to tabellene som skal kobles sammen. Rekkefølgen spiller ingen rolle. Du vil da se at det dukker opp en ny tabell imellom de to tabellene, Skuespiller_has_Film, som har primærnøklene fra de to tabellene som attributter. Den nye tabellen brukes til å holde orden på relasjonen mellom de tabellene, altså hvilke skuespillere som spiller i hvilke filmer, ved å koble primærnøkkelen til en film til primærnøkkelen til en skuespiller. Begge disse to attributtene utgjør en delt primærnøkkel for denne nye tabellen. Det vil si at forholdet mellom en skuespiller og en film blir til sammen en unik identifikator for denne tabellen. Linjene mellom tabellene er heltrukket fordi Skuespiller_has_Film er en svak entitet – den kan ikke eksistere uavhengig av tabellene Skuespiller og Film. Derfor finnes det heller ikke en variant av mange-til-mange-relasjon med stiplet linje.

Skjermbilde fra programmet MySQL Workbench. Animasjon

Noen ganger vil det være nyttig å legge inn flere attributter i denne nye tabellen, hvis det finnes relevant informasjon som er unikt definert av forholdet mellom de to tabellene i mange-til-mange-relasjonen. I relasjonen mellom en film og en skuespiller kan for eksempel navnet på rollefiguren som skuespilleren spiller i filmen, være aktuelt å legge inn. Det vil også være praktisk å endre navnet på tabellen til noe som er mer beskrivende, som for eksempel Rolle i dette tilfellet.

Datamodell skuespiller-rolle-film. Illustrasjon.
Åpne bilde i et nytt vindu

Minimumskardinalitet i mange-til-mange-relasjoner

Kardinalitet i mange-til-mange-relasjoner kan være vanskeligere å forholde seg til på grunn av den ekstra tabellen som settes inn. I praksis er en mange-til-mange-relasjon to én-til-mange-relasjoner som er satt sammen. Derfor kan en slik relasjon være litt vanskeligere å lese. Det kan være nyttig å endre navn på denne tabellen til noe som beskriver forholdet. I relasjonen film-skuespiller kan navnet på denne tabellen være Rolle. Du kan da lese relasjonen slik:

Skuespiller

  • En skuespiller kan ha spilt én eller flere roller.
  • En rolle spilles av én og bare én skuespiller.

Film

  • En film kan ha én eller flere rollefigurer.
  • En rollefigur tilhører én og bare én film.

Hvis du ønsker å endre på minimumskardinaliteten på en av disse én-til-mange-relasjonene, gjør du det på samme måte som over. For eksempel kan vi tenke oss at du vil tillate å legge inn skuespillere som ikke har spilt noen roller enda. Dette ville vært for å få muligheten til å legge inn skuespillere i databasen før du legger inn filmen de spiller i, eller at du ønsker å legge inn en ny film før du legger til skuespillere/roller i filmen.

Skjermbilde fra programmet MySQL Workbench
CC BY-SASkrevet av Karl Arne Dalsaune.
Sist faglig oppdatert 19.08.2020

Læringsressurser

Database