Hopp til innhald
Fagartikkel

Relasjonar og kardinalitet

Viss du har laga har ein datamodell med fleire tabellar, må tabellane koplast saman med ein relasjon. Ein relasjon representerer då ei kopling mellom dei to tabellane og viser at dei har noko til felles.
Video: Netron AS / CC BY-SA 4.0
Kort samandrag av animasjonen om relasjonar i databasar

Animasjonen viser ein stor tabell med kolonnar for personleg identitetsnummer, fornamn, etternamn, postnummer, poststad, idrett, idrettstype og spelarnummer. Mykje av informasjonen i tabellen heng naturleg saman, for eksempel postnummer og poststad, og idrett og idrettstype. Det er derfor lurt å dele tabellen opp i fleire mindre tabellar og kople desse saman med relasjonar. Spesielt viktig er det at alle tabellane har ein eigen primærnøkkel. Primærnøklane er nødvendige for å kunne kople saman tabellane i ein database.

Tidlegare har vi brukt dømet Bileigar - Bil, der ein bileigar kan eige fleire bilar, medan ein bil berre kan ha éin eigar.

Det finst tre ulike typar relasjonar:

  • 1:1 – éin-til-éin-relasjon (blir svært sjeldan brukt og vil ikkje bli gjennomgått her)
  • 1:n - éin-til-mange-relasjon
  • n:m - mange-til-mange-relasjon

Kardinalitet

Dei ulike typane relasjonar blir kalla kardinalitet. Kardinalitet blir delt opp i maksimumskardinalitet og minimumskardinalitet. I figuren over har kvar side av relasjonen to symbol. Det symbolet som er nærast tabellen (inst) er maksimum, og det symbolet som er lengst unna tabellen (ytst) er minimum. Symbola som blir brukte er:

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

Når vi snakkar om dei tre typane relasjonar som blir nemnde over, er det maksimumskardinalitet vi snakkar om. I relasjonen bileigar-bil kan ein bileigar ha éin eller fleire bilar, og ein bil kan ha éin og berre éin eigar.

Éin-til-mange-relasjon

For å opprette ein éin-til-mange-relasjon i MySQL Workbench klikkar du på verktøyet merka 1:n med stipla linje.

Stipla eller heiltrekt linje?

Forskjellen på relasjonar med stipla og heiltrekt linje er om tabellane er det vi kallar svake entitetar eller ikkje. Ein svak entitet er ein tabell som berre kan eksistere i samband med ein annan tabell, tenk til dømes på relasjonen mellom tabellane "Bygning" og "Rom": Eit rom kan ikkje eksistere utan at det er kopla til ein bygning. Derfor er Rom ein svak entitet, og her vil vi då bruke ei heiltrekt linje. Svake entitetar har alltid primærnøkkelen til den relaterte tabellen som ein del av sin primærnøkkel (i kombinasjon med sin eigen ID).

Det er berre i spesielle tilfelle vi bruker heiltrekt linje, så som hovudregel kan du bruke stipla linje overalt.

Merk at mange-til-mange-relasjonar berre finst med heiltrekt linje. Du skal lære meir om mange-til-mange-relasjonar lenger ned i denne artikkelen.

Så klikkar du først på den tabellen som skal vere mange-sida i relasjonen (Bil). Til slutt klikkar du på tabellen som skal vere éin-sida i relasjonen (Bileigar). Du vil då sjå at det dukkar opp eit ekstra attributt i Bil-tabellen. Dette attributtet er det same som primærnøkkelen i Bileigar, og blir kalla ein framandnøkkel.

Minimumskardinalitet i éin-til-mange-relasjonar

I relasjonen bileigar-bil har du no angitt at ein bileigar kan eige éin eller fleire bilar. Men kva med om ein bileigar sel bilen sin og er utan bil i ein periode? Då ønskjer du framleis å behalde bileigaren i databasen. Du må då gjere noko med minimumskardinaliteten for å gjere det mogleg at ein bileigar ikkje alltid må eige minst éin bil. For å gjere dette må du redigere relasjonen ved å dobbelklikke på linja mellom tabellane Bileier og Bil. Du får då opp ei ny fane som heiter Relationship. I denne fana klikkar du på Foreign Key nedst på skjermen. Då får du sjå sidene i relasjonen og informasjon om kardinaliteten. Her går det òg an å endre relasjonstypen.

For å setje minimumskardinalitet til 0 må du fjerne haka frå feltet Mandatory i den sida av relasjonen der du ønskjer endre minimumskardinaliteten. I dette tilfellet blir det ved tabellen Bil – det er denne sida som angir at ein bileigar kan eige éin eller fleire bilar. Når du har klikka bort haka frå Mandatory-feltet kan du klikke inne i teiknefeltet igjen. Du vil då sjå at 1-talet ved tabellen Bil blir endra til 0. Du har no angitt at ein bileigar kan eige null eller fleire bilar.

Mange-til-mange-relasjon

Tenk deg ein database som skal gi oversikt over ei rekkje filmar og kva skodespelarar som er med i kvar film. Då trengst ein tabell for filmar og ein tabell for skodespelarar. Ein film kan ha mange skodespelarar, og ein skodespelar kan spele i mange filmar. Dette er eit døme på ein mange-til-mange-relasjon.

Når du skal lage ein mange-til-mange relasjon i MySQL Workbench, klikkar du på verktøyet merka med n:m. Så klikkar du på kvar av dei to tabellane som skal koplast saman. Rekkjefølgja speler inga rolle.

Du vil då sjå at det dukkar opp ein ny tabell imellom dei to tabellane, Skodespelar_has_Film, som har primærnøklane frå dei to tabellane som attributt. Den nye tabellen blir brukt til å halde orden på relasjonen mellom dei tabellane, altså kva skodespelarar som speler i kva filmar, ved å kople primærnøkkelen til ein film til primærnøkkelen til ein skodespelar. Begge desse to attributta utgjer ein delt primærnøkkel for denne nye tabellen. Det vil seie at forholdet mellom ein skodespelar og ein film blir til saman ein unik identifikator for denne tabellen. Linjene mellom tabellane er heiltrekte fordi Skodespelar_has_Film er ein svak entitet – han kan ikkje eksistere uavhengig av tabellane Skodespelar og Film. Derfor finst det heller ikkje ein variant av mange-til-mange-relasjon med stipla linje.

Nokon gonger vil det vere nyttig å leggje inn fleire attributt i denne nye tabellen, viss det finst relevant informasjon som er unikt definert av forholdet mellom dei to tabellane i mange-til-mange-relasjonen. I relasjonen mellom ein film og ein skodespelar kan til dømes namnet på rollefiguren som skodespelaren speler i filmen, vere aktuelt å leggje inn. Det vil òg vere praktisk å endre namnet på tabellen til noko som er meir beskrivande, som til dømes Rolle i dette tilfellet.

Minimumskardinalitet i mange-til-mange-relasjonar

Kardinalitet i mange-til-mange-relasjonar kan vere vanskelegare å halde seg til på grunn av den ekstra tabellen som blir sett inn. I praksis er ein mange-til-mange-relasjon to éin-til-mange-relasjonar som er sette saman. Derfor kan ein slik relasjon vere litt vanskelegare å lese. Det kan vere nyttig å endre namn på denne tabellen til noko som beskriv forholdet. I relasjonen film-skodespelar kan namnet på denne tabellen vere Rolle. Du kan då lese relasjonen slik:

Skodespelar

  • Ein skodespelar kan ha spelt éi eller fleire roller.
  • Ei rolle blir spelt av éin og berre éin skodespelar.

Film

  • Ein film kan ha éin eller fleire rollefigurar.
  • Ein rollefigur tilhøyrer éin og berre éin film.

Viss du ønskjer å endre på minimumskardinaliteten på ein av desse éin-til-mange-relasjonane, gjer du det på same måte som over. Til dømes kan vi tenkje oss at du vil tillate å leggje inn skodespelarar som ikkje har spelt nokon roller endå. Dette ville vore for å få moglegheita til å leggje inn skodespelarar i databasen før du legg inn filmen dei speler i, eller at du ønskjer å leggje inn ein ny film før du legg til skodespelarar/roller i filmen.