Relaatiot ja liitokset - Raision-seudun-koulutuskuntayhtyma/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).

Seuraavassa kuvassa on pienen tietokannan käsitemalli:

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.

Relaatiosymbolit

  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-yhteen-liitos

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-relaatio

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 perusteella 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 vastinkenttien arvot ovat samat
Ulkoliitos (outer join) tulosjoukkoon tulee toisesta taulusta kaikki rivit ja toisesta ne, joissa vastintenttien arvo 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.

-- Joulukorttilista: 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