Relaatiot ja liitokset - Juha02/Tietokannat GitHub Wiki

Relaatiot

SQL-pohjaisissa tietokannoissa taulut liitetään toisiinsa relaatioiden avulla. Tämän tarkoituksena on varmistaa tietokannan tietojen järkevyys. Tästä käytetään nimitystä eheys (integrity). Tarkkaan ottaen taulujen yhteydessä puhutaan viite-eheydestä (referential integrity). Relaatiot syntyvät ns. Normalisoinnin tuloksena (normalization).

Käsitemalli

Relaatiokaavion tulkinta

Relaatiot piirretään taulujen välille käyttäen vakiintunutta kuvaustapaa. Joissakin tietokannan hallintajärjestelmissä käytetään poikkeavia symboleita, mutta niiden käytön oppii nopeasti, kun standardikuvaustapa on tuttu.

Symbolin tulkinta

  1. Yksi (pystyviiva)
  2. Nolla (rengas)
  3. Monta (haarukka)

Yksi yhteen

Yksi-yhteen relaatio on sallittu, mutta tekee tietokannasta monimutkaisemman kuin olisi tarpeen. Seuraavassa kuvassa yksi-yhteen relaatio.

Yksi-yhteen-relaatio

Yhdellä asiakkaalla on yksi Y-tunnus

Relaatio poistetaan ja sijoitetaan viiteavaintaulun sarakkeet perusavaintauluun.

Purettu

Yksi-moneen

Tämä on relaatio, jota tavoitellaan. Esimerkiksi asiakkaalla on monta yhteyshenkilöä. Yhteyshenkilöiden tiedot sijoitetaan omaan tauluun ja rivit kytketään asiakkaaseen viiteavaimen (foreign key) avulla.

Yksi-moneen-relaatio

Yhdellä asiakkaalla on monta yhteyshenkilöä

Monta-moneen

Monta-moneen-relaatio on kielletty. Se puretaan kahdeksi yksi-moneen-relaatioksi uuden taulun eli ns. välittävän käsitteen avulla.

Monta-moneen

Seuraavassa kuvassa on esimerkki relaation purkamisesta kahdeksi yksi-moneen relaatioksi:

Välittävä-käsite

Liitokset

Kun tietokannasta halutaan tehdä kyselyitä (query), on oikean tulosjoukon (result set) saamiseksi kerrottava, millä tavalla taulut liittyvät toisiinsa- Joissakin tietokannan hallintajärjestelmissä relaatioiden perustella tehdään automaattisesti liitokset eri taulujen välille. Useimmissa tapauksissa ohjelmoija, joka kirjoittaa kyselyä, joutuu määrittelemään liitosehdot käsin vastaamaan käsitemallin relaatioita. Perusliitostyypit ilmenevät seuraavasta taulukosta:

Liitos Käyttötarkoitus
Sisäliitos (inner join) tulosjoukkoon tulevat ne rivit molemmista tauluista, joissa hakukriteeri on sama
Ulkoliitos (outer join) tulosjoukkoon tulee toisesta taulusta kaikki rivit ja toisesta ne, joissa hakukriteeri on sama
Luonnollinen liitos (natural join) kuten sisäliitos, mutta kriteerejä ei tarvitse kirjoittaa

Sisäliitos

Yleisin ja tärkein taulujen välinen liitos. Tulosjoukkoon tulevat vain ne rivit, missä määriteltyjen sarakkeiden arvot ovat samat. Seuraavassa koodikatkelmassa on esimerkki vuokraustietokannasta:

-- Haetaan kaikki asiakkaat, joilla on vuokraus
SELECT vuokraus.asiakasnumero, asiakas.yritys, asiakas.postitoimipaikka 
FROM vuokraus INNER JOIN asiakas ON vuokraus.asiakasnumero = asiakas.asiakasnumero

Tulosjoukkoon (result set) tulevat vain niiden asiakkaiden tiedot, joiden asiakasnumero löytyy vuokraus-taulusta.

Samaan lopputulokseen pääsee myös perinteisiä ehtoja käyttämällä:

-- Haetaan kaikki asiakkaat, joilla on vuokraus
SELECT vuokraus.asiakasnumero, asiakas.yritys, asiakas.postitoimipaikka 
FROM vuokraus, asiakas
WHERE asiakas.asiakasnumero  = vuokraus.asiakasnumero 

Ulkoliitokset

Ulkoliitoksia on kolmea eri tyyppiä: vasen (left), oikea (right) täydellinen (full) ulkoliitos. SQLite tukee kuitenkin ainoastaan vasenta ulkoliitosta. Siinä ensinmainitusta (vasemmasta) taulusta saadaan kaikki rivit ja toisesta (oikeasta) taulusta ne rivit joissa on sama tieto.Esim.

-- Joulukortti: kaikki asiakkaat asiakas-taulusta ja yhteyshenkilö-taulusta vastaavat rivit. Postitoimipaikat aakkostettuna
SELECT asiakas.asiakasnumero, asiakas.yritys, yhteyshenkilo.etunimi, yhteyshenkilo.sukunimi,asiakas.laskutusosoite , asiakas.postinumero , asiakas.postitoimipaikka 
FROM asiakas LEFT OUTER JOIN yhteyshenkilo ON asiakas.asiakasnumero  = Yhteyshenkilo.asiakasnumero 
ORDER BY postitoimipaikka