Relasjoner og kardinalitet
Tidligere har vi brukt eksempelet Bileier - Bil, der en bileier kan eie flere biler, mens en bil kun kan ha én eier.
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
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.
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.
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.
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.
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.
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.
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.
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.