E. F. Codd esitteli relaatiomallin peruskäsitteet vuonna 1970 artikkelissaan: E.F.Codd: A Relational Model of Data for Large Shared Data Banks, Communications of the ACM, Vol. 13, No. 6, June 1970, pp. 377-387. Malli perustana on selkeä matemaattinen käsitteistö. Toisaalta malli on hyvin yksinkertainen ja helposti hahmotettavissa.
Sisältö | |||
Lisämateriaalia |
|
Relaatiotietokantojen perusajatuksena on tiedon hahmotus matemaattisina relaatioina. Kukin relaatio kuvaa jotakin todellisuuden ilmiötä.
Relaatiomallin mukainen relaatio määritellään seuraavasti
Olkoon D1, D2, ..., Dn atomisista arvoista koostuvia arvojoukkoja (domain). Relaatio R on joukko monikkoja [tuple, n-tuple] (a1,a2,...,an), joiden ensimmäinen arvo a1 kuuluu joukkoon D1, toinen arvo a2 joukkoon D2 jne. Relaatio on siis ristitulon
D1 D2 ... Dn osajoukko.
Arvojoukko koostuu joukosta arvoja (value). Arvot ovat arvojoukon alkioita. Arvot ovat esimerkiksi nimiä asioille, mittalukuja tai koodeja. Arvojoukko voisi olla vaikkapa
Matemaattisessa joukossa:
Arvojoukkojen K ja P ristitulo:
X x Z =
{ (0,kissa), (0,koira), (0,marsu),
(1,kissa), (1,koira), (1,marsu),
(2,kissa), (2,koira), (2,marsu),
(3,kissa), (3,koira), (3,marsu) }
Arvojoukkoihin X ja Z perustuvia relaatioita ovat esimerkiksi
XZ1 = { (0,kissa), (1,koira) } ja
XZ2 = { (1,marsu), (2,kissa), (3,kissa) } ja
XZ3 = { } = tyhjä joukko
Tehtävä (linkki tehtävään)
Jokaiseen relaatioon liittyy jokin tulkinta monikoissa olevien arvojen tarkoitukselle. Tietyssä paikassa olevalla arvolla on tietty merkitys. Esimerkiksi relaation
XZ1 = { (0,kissa), (1,koira) }
2-paikkaisissa monikoissa ensimmäinen alkio voisi ilmaista eläimen tunnuksen ja jälkimmäinen eläimen lajin jolloin relaation monikko esittäisi eläimen olemassaoloa.
Jos kaksi relaatiota perustuu samoihin arvojoukkoihin ja niihin liittyvät arvojen tulkinnat ovat samat, on kyseessä saman relaatiokaavion (relation schema) kaksi ilmentymää (instance), esimerkiksi XZ1 ja XZ2 ovat saman relaatiokaavion ilmentymiä. Relaatiokaavio puolestaan on ilmentymiensä määrittely ja ilmentymät ovat määrittelynsä mukaisia.
Relaatiokaaviolle annetaan sen ilmentymien tarkoitusta kuvaava nimi, esimerkiksi ilmentymät XZ1 ja XZ2 voisivat olla kaavion 'Eläin' ilmentymiä. Alkioiden paikoille relaation monikoissa (ensimmäinen, toinen, jne) annetaan paikassa olevan alkion merkitystä kuvastava nimi. Siten kaavion 'Eläin' kohdalla voitaisiin monikoiden ensimmäistä alkiota kutsua eläintunnukseksi ja toista lajiksi. Alkion paikalle annettua nimeä kutsutaan attribuutiksi. Kaavio voidaan nyt esittää yksinkertaisessa muodossa
Eläin(eläintunnus, laji)
eli määritellään 2-paikkaisia relaatioita, joiden monikoissa ensimmäisessä paikassa on eläintunnus ja jälkimmäisessä laji. Täydellisemmässä kaavioesityksessä
Eläin(eläintunnus:X, laji:Z)
on mukaan otettu arvojoukot kertomaan, että eläintunnus-arvo otetaan arvojoukosta X ja laji-arvo arvojoukosta Y.
Kaavio voidaan esittää myös kuvana
Relaatiokaavioon liittyvät arvojoukot tulisi valita sellaisiksi, että niiden arvot kattavat kaikki mahdolliset reaalimaailman tilanteet, joita relaatiokaavion ilmentymien pitäisi kyetä esittämään. Yllä arvojoukkoon X pitäisi kuulua kaikki mahdolliset eläintunnukseksi kelpaavat arvot ja arvojoukoon Z kaikki mahdolliset lajinimet.
Relaatio voidaan esittää havainnollisesti taulukkona, esimerkiksi kaavion Eläin(eläintunnus, laji) ilmentymänä relaatio XZ2 = { (1,marsu), (2,kissa), (3,kissa) } esitettäisiin muodossa:
Koska relaatio on matemaattinen joukko, ovat kaikki relaation monikot keskenään erilaisia. Monikot kyetään erottamaan toisistaan eli yksilöimään sisältönsä perusteella. Erotteluun ei välttämättä tarvita kaikkia monikon arvoja. Esimerkiksi seuraavassa relaatiossa riittää monikoiden (rivien) yksilöintiin eläintunnus-paikassa (sarakkeessa) oleva arvo.
Avain
muodostuu niistä monikkojen paikoista, joissa olevien arvojen avulla relaation monikot voidaan yksilöidä missä tahansa kyseisen relaatiokaavion ilmentymässä eikä yksilöinti ole mahdollista jättämällä jokin paikoista pois
Kun määritellään attribuutin 'eläintunnus' nimeämä paikka kaavion Eläin mukaisten relaatioiden avaimeksi asetetaan kaavion Eläin ilmentymille sääntö:
Aina ei ole löydettävissä vain yhtä paikkaa, jossa oleva arvo riittäisi yksilöintiin vaan tarvitaan useammassa paikassa olevia arvoja. Seuraavassa relaatiossa kuvataan eläinten nauttimia ruoka-aineita.
Relaatiosta ei löydy yhtä paikkaa (saraketta), jonka arvojen perusteella rivit olisi yksilöitävissä. Tämän ilmentymän perusteella paikat
Yksilöivätkö nämä yhdistelmät relaation monikot kaikissa Ruokailu -ilmentymissä?
Tässä tapauksessa ainoa todellisuutta heijastava avainmääritys on yhdistelmä
eläintunnus, päivä, ruokalaji,
joka tarkoittaa sitä, että tietystä ruokalajista tehdään kullekin eläimelle vain yksi kirjaus päivää kohden. Tämän relaatiokaavion kohdalta on syytä todeta, että tätä ei voi käyttää kirjaamaan jokaista erillistä syöntikertaa. Eläinhän voisi syödä kahdella erillisellä syöntikerralla saman määrän samaa ruokalajia ja tällöin relaatioon tulisi kaksi samanlaista riviä, mikä ei määritelmän mukaan ole mahdollista. Jos erilliset syöntikerrat halutaan kirjata, täytyy relaatiokaavioon ottaa lisätietona mukaan vaikkapa kellonaika ja ottaa se myös avaimeen.
Tyhjäarvo
Tyhjäarvo (null) on erikoisarvo, jota käytetään kun
Avaimeen kuuluviksi määritellyissä paikoissa ei voi olla tyhjäarvoja.
Tarkastellaan relaatiokaaviota
Henkilö(Nimi, Osoite, Kännykkänumero, ...)
Nimi ei yksinään riitä yksilöintiin. Kännykkänumero, olettaen, että kännykät ovat henkilökohtaisia, riittäisi, mutta kaikilla ei ole kännykkää, joten kännykkänumeroa ei voi käyttää edes avaimen osana. Nimi ja osoite yhdistelmä saattaisi riittää yksilöintiin, jos osoitteet ovat riittävän tarkkoja ja kaikki osoitteet tiedetään. Henkilötunnus tietenkin riittäisi yksilöintiin, jos henkilöiden joukossa ei ole ulkomaalaisia, joilta puuttuu tunnus, ja henkilötunnuksen ottamiselle relaatioon ei ole muita esteitä kuten tietosuoja. Käytännössä tällaisessa tilanteessa turvaudutaan usein keinotekoiseen automaatisesti tuotettuun avaimeen (surrogate, keinoavain), joka tässä tapauksessa olisi vaikkapa henkilönumero.
Pääavain (primary key)
Usein on mahdollista löytää monta sellaista paikkayhdistelmää, joissa olevia arvoja voisi käyttää relaation monikoiden yksilöintiin. Näiden mahdollisten avainten joukosta on valittava yksi erityisasemaan pääavaimeksi eli ensisijaiseksi tavaksi viitata relaatiokaavion ilmentymien monikoihin.
Pääavaimen merkitseminen relaatiokaavioon
Pääavain merkitään relaatiokaavioon alleviivaamalla kaikki pääavaimeen kuuluvat attribuutit:
Relaatiotietokanta muodostuu useasta relaatiosta. Nämä eivät ole toisistaan riippumattomia vaan relaation monikoiden välillä on kytkentöjä. Monikot kytketään toisiinsa sisällyttämällä yhteen monikkoon viittaus (reference) toiseen monikkoon. Relaation monikoilla ei ole järjestysnumeroa tai muuta ulkoista tunnistetta. Niinpä viittaukset täytyy tehdä monikon sisältöön perustuvaa yksilöintitietoa eli pääavainta käyttäen.
Viiteavain (foreign key)
Viiteavaimen muodostavat ne relaatiokaavion mukaisten monikkojen paikat (sarakkeet), joita käytetään viittauksen esittämiseen
Viiteavaimeen kuuluu yhtä monta paikkaa kun on viitatun kohteen avaimessa.
Samaan monikkoon voi kohdistua useita viittauksia.
Monikko voi sisältää useita viittauksia. Yhdessä arvopaikassa voi kuitenkin olla vain yksi arvo. Yllä olevan kuvan Ruokailu-relaatiossa on kaksi viiteavainta. Eläintunnus viittaa Eläin-monikkoon ja ruokalaji viittaa Ruokalaji-monikkoon.
Tällä kurssilla viiteavain esitetään relaatiokaaviossa siten, että viiteavaimena käytettävän attribuutin perään liitetään nuoli ja viitatun relaatiokaavion nimi. Kuvaesityksessä viiteavain-attribuutista piirretään nuoli viitattuun kaavioon.
Esimerkki:
Eläin( eläintunnus, laji)
Ruokalaji( lajitunnus, energia)
Ruokailu( eläintunnus->Eläin, päivä, ruokalaji ->Ruokalaji, määrä)
Viittauksessa tulisi aina käyttää kohteena olevan kaavion pääavainta. Kuvassa nuoli lähtee siitä paikasta (attribuutista), joka toimii viiteavaimena, mutta kärjen ei tarvitse osua kohteen pääavaimeen.
Jos viittauksen kohteen pääavain on monipaikkainen, tarvitaan myös viiteavaimeen useita paikkoja. Monipaikkainen viittaus Kirjaus-monikoista Ruokailu-monikoihin esitetään seuraavasti
Kirjaus( kirjausnro, (eläintunnus, päivä, ruokalaji) ->Ruokailu, päivittäjä, ...)
Viittaus voi kohdistua myös monikkoon, joka on samassa relaatiossa kuin viittaava monikko. Esimerkiksi
Kaaviossa tämä esitetään
Eläin2( eläintunnus, emo ->Eläin2, laji )