Relasjonar og kardinalitet
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
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.
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.
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.