Hopp til innhald
Nynorsk
Fagstoff
Film

Relasjonar og kardinalitet

Om du 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.

Film: Relasjonar i databasar

Animasjonen under (lengde 1:23) viser korleis relasjonar mellom tabellar i databasar fungerer.

Film: Netron AS / CC BY-SA 4.0

Relasjonane vi bruker mellom tabellar i databasar

Tidlegare har vi brukt dømet "Bileigar" og "Bil", der ein bileigar kan eige fleire bilar, mens 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 kallar vi kardinalitet. Kardinalitet blir delt opp i maksimumskardinalitet og minimumskardinalitet. I figuren over har kvar side av relasjonen to symbol. Det symbolet som er nærmast 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 ei 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 primærnøkkelen sin (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 på denne sida.

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 sagt 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å ønsker 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 "Bileigar" og "Bil". Du får då opp ei ny fane som heiter "Relationship". I denne fanen 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 haken frå feltet "Mandatory" i den sida av relasjonen der du ønsker endre minimumskardinaliteten, i dette tilfellet ved tabellen "Bil" (det er denne sida som seier at ein bileigar kan eige éin eller fleire bilar). Når du har klikka bort haken 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 sagt at ein bileigar kan eige null eller fleire bilar.

Mange-til-mange-relasjon

Tenk deg ein database som skal gi oversikt over ei rekke 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 merkt med n : m. Såg klikkar du på kvar av dei to tabellane som skal koplast saman. Rekkefølga 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.

Av og til vil det vere nyttig å legge inn fleire attributt i denne nye tabellen, dersom 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 å legge 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 å forhalde 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.

Om du ønsker å 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 tenke oss at du vil tillate å legge inn skodespelarar som ikkje har spelt nokon roller endå. Dette ville vore for å få høve til å legge inn skodespelarar i databasen før du legg inn filmen dei speler i, eller at du ønsker å legge inn ein ny film før du legg til skodespelarar/roller i filmen.

Skrive av Karl Arne Dalsaune.
Sist oppdatert 19.08.2020