Viite-eheys (Referential Integrity)
Timo Ahjos 7.5.1999
Relaatiotietokannan eri taulujen välillä voi olla viittauksia, jotka kytkevät
taulujen tietosisällöt toisiinsa. Tyypillinen kytkentä on "äiti-lapsi"-suhde
(Parent-Child), jolloin jälkimmäisen taulun jokaisella rivillä on viittaus
edellisen taulun johonkin riviin. Viite-eheydellä tarkoitetaan sitä, että
taulujen väliset viittaukset ovat kunnossa.
dBASE:n tietokantakoneisto huolehtii
viite-eheydestä automaattisesti sille annettujen sääntöjen mukaisesti.
Jos tietokantataulut ovat jossakin ulkopuolisessa SQL-tietokantakoneistossa,
automatiikka toimii siinä laajuudessa kuin ao. tietokantakoneisto tukee
tällaista automatiikkaa.
Seuraavassa kuvataan yksinkertaista esimerkkiä käyttäen, kuinka eheyssäännöt
käytännössä määritellään. Esimerkissä on kaksi taulua, joiden avainkentät ovat
seuraavat:
Taulu Customer.dbf on "parent",
sisältää asiakkaan perustiedot
|
|---|
| Kentän nimi | Tyyppi | Indeksi *)=Ensisijainen | Sisältö
|
|---|
| Customer ID | Char 5 | *) Nouseva | Asiakastunnus
|
| Last name | Char 30 | Nouseva | Sukunimi
|
Taulu Invoice.dbf on "child",
sisältää kuukausilaskuja koskevat tiedot
|
|---|
| Kentän nimi | Tyyppi | Indeksi *)=Ensisijainen | Sisältö
|
|---|
| Invoice | Autoincr. | *) Nouseva | Laskun tunnus
|
| Customer ID | Char 5 | Nouseva | Asiakastunnus
|
"Nouseva indeksi" tarkoittaa vain sitä, että silloin
kun taulun rivit näytetään tuon kentän mukaisessa järjestyksessä,
ne ovat nousevassa numero- tai aakkosjärjestyksessä.
Vaihe 1:
Avataan se projekti, jonka tietokantatauluja halutaan käsitellä.
Otetaan esille valikon kohdasta File / Database Administration seuraava
lomake:
- Current database: Jos tietokannalle on määritelty alias-nimi, se näkyy tässä.
Alias-nimet määriteltiin BDE:ssä ja ne olivat tarpeellisia vain silloin, kun
käytetään jotakin ulkopuolista SQL-tietokantaa. Jos sensijaan käytetään dBASE:n
omia luontaisia tietokantatauluja, alias-nimeä ei tarvita.
- Table type: Valittavissa on dBASE- ja Paradox-tyyppiset taulut.
- Security: Painonapista avautuu käyttöoikeuksien määrittelytoiminto,
joka käsitellään erikseen sivulla "Käyttöoikeudet". Se ei liity mitenkään tällä
sivulla käsiteltävään aiheeseen.
- Referential integrity: Painonappi, josta päästään viite-eheyden määritelyyn.
Vaihe 2:
Yllä olevassa kuvassa näkyy valmiina kahden taulun välille määritelty Parent-Child-suhde.
Tuon suhteen eli relaation nimi "customerinvoice" on muodustunut taulujen nimistä
"customer" ja "invoice". Ennen kuin se määriteltiin, tämä lomake oli tyhjä ja
määrittelylomake saatiin esille painamalla "New"-nappia. Nyt kun määrittely
on tehtynä, sitä voidaan muuttaa painamalla "Modify"-nappia. Jos tietokannassa olisi
useampia tauluja, niiden välille voitaisiin määritellä muitakin relaatioita. "Drop"-napin
painallus yksinkertaisesti poistaa luettelosta valitun, aiemmin määritellyn relaation.
Jos tietokanta on käytössä, näiden määrittelyjen tekijällä täytyy olla muut
samanaikaiset käyttäjät poissulkeva pääsy tauluihin, joita määrittely koskee.
Relaatioiden ja viite-eheyssääntöjen määrittelylomake, joka siis avautuu "New"- ja
"Modify"-napeista, on tällainen:
- Rule name: Relaation nimi, joka muodostuu automaattisesti parent- ja child-
taulujen nimistä.
- Parent table: Valitaan parent-taulu luettelosta, jossa näkyy tietokannan
kaikki taulut. Sen avainkenttien nimet ilmestyvät alempana olevan "References"
-osan vasempaan palstaan, jonka otsikkona on "Primary key fields".
- Child table: Valitaan child-taulu luettelosta, jossa näkyy tietokannan
kaikki taulut. Valitun taulun kaikki sellaiset kentät, joihin viite-eheyssääntöjä
voi soveltaa, ilmestyvät ikkunaan, jonka otsikkona on "Available child fields".
- Related child fields: Tämä palsta on aluksi tyhjä. Edellä mainitusta
luettelosta "Available child fields" valitaan jokin kentän nimi ja painetaan
"<"-nappia,
jolloin valitun kentän nimi kopioituu tähän palstaan. Relaatio tai viite-eheyssääntö
muodostuu silloin niiden kahden kentän välille, joiden nimet ovat keskenään samassa
ikkunassa samalla rivillä.
Vasemmalla puolella on Parent-taulun ja oikealla puolella Child-taulun kentän nimi.
Tässä esimerkissä kummassakin taulussa on käytetty samaa kentännimeä "Customer ID".
Kenttien nimien ei kuitenkaan tarvitse olla keskenään samat. Kenttien nimillä
ei ole mitään merkitystä, mutta kenttien pitää olla keskenään samaa tyyppiä ja
yhtä pitkiä.
Jos parent-taulun primääriavain muodostuu useista kentistä, silloin myös
child-taulusta pitää poimia em. ikkunaan allekkain kaikki vastaavat kentännimet.
Ensin valitaan ikkunassa parent-taulun kenttä ja sitten sitä vastaava child-taulun
kenttä. Siten vastinkenttien nimet saadaan keskenään samoille riveille.
- Update behavior: Parent-taulun avaintietojen muuttamista koskeva eheyssääntö,
jota noudatetaan silloin, kun muutettavaan riviin liittyy siitä riippuvia
child-taulun rivejä. Sääntövaihtoehtoja on kaksi:
- Restrict: Avainkentän arvoa ei voi muuttaa parent-taulussa, jos
child-taulussa on siihen viittaavia rivejä.
- Cascade: Jos avainkentän arvoa muutetaan parent-taulussa, vastaava
muutos tehdään automaattisesti myös niihin child-taulun kenttiin, jotka viittaavat
muutettuun arvoon. (Huom! Kaikki ulkoiset SQL-tietokantakoneistot eivät tue "Cascade"-vaihtoehtoa.)
- Delete behavior: Parent-taulun rivin poistamista koskeva eheyssääntö.
Sääntövaihtoehdot ovat samat kaksi kuin edellä:
- Restrict: Parent-taulun riviä ei voi poistaa, jos siihen on viittauksia
child-taulussa.
- Cascade: Parent-taulun rivin poistamisesta seuraa automaattisesti myös
siihen viittaavien child-taulun rivien poistuminen. (Huom! Kaikki ulkoiset SQL-tietokantakoneistot eivät tue "Cascade"-vaihtoehtoa.)
- Relationship:
- One-to-one: Child-taulussa voi olla vain yhdellä rivillä viittaus
tiettyyn parent-taulun riviin. Tällöin siis relaatio on määriteltynä parent-taulun
primääriavaimen ja child-taulun primääriavaimen tai muun sellaisen kentän välillä,
johon liittyy yksikäsitteinen indeksi (unique index).
- One-to-many: Child-taulussa voi olla useilla riveillä viittaus
samaan parent-taulun riviin. Tällöin siis relaatio on määriteltynä parent-taulun
primääriavaimen ja child-taulun jonkin indeksoidun kentän välillä. Jälkimmäinen
ei voi olla child-taulun primääriavain, koska sama arvo voi toistua eri riveillä.
Sivun alkuun
Seuraava sivu: Käyttöoikeudet