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:
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.
- Yksi (pystyviiva)
- Nolla (rengas)
- Monta (haarukka)
Yksi-yhteen
Yksi-yhteen relaatio on sallittu, mutta tekee tietokannasta monimutkaisemman kuin olisi tarpeen. Seuraavassa kuvassa yksi-yhteen relaatio.
Yhdellä asiakkaalla on yksi Y-tunnus
Relaatio poistetaan ja sijoitetaan viiteavaintaulun sarakkeet perusavaintauluun.
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.
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.
Seuraavassa kuvassa on esimerkki relaation purkamisesta kahdeksi yksi-moneen relaatioksi:
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