TIETOKANTOJEN PERUSTEET

Näkymät

Oheismateriaalia
  • Elmasri&Navathe: luku 9.2, sivut 257-261
  • Ramakrishnan&Gehrke: luku 3.6, sivut 86-90
  • Laine: luvut 5.4.11, sivut 78-81

 

SQL-tietokannassa on kahden tyyppisiä tauluja: perustauluja ja johdettuja tauluja. Johdetut taulut määritellään kyselyn avulla. Näkymät (views) ovat johdettuja tauluja, joita ei tallenneta mihinkään. Ne ovat olemassa vain määritelminä. Näkymäksi määriteltyä taulua voi käyttää kyselyissä kuten perustauluja. Niille voidaan antaa käyttöoikeuksia samoin kuin perustauluille. Jopa näkymään kohdistuvat ylläpito-operaatiotkin ovat rajoitetusti mahdollisia.

Näkymä määritellään seuraavasti

Esimerkki N1. (ks. esimerkkikannan kaavio)

muoto
create view näkymän_nimi [(sarakenimilista)] as

   kysely
esimerkki
create view tyhja_kurssi
  (kurssikoodi, lukuvuosi,lukukausi,kurssinumero) as
  select kurssikoodi,lukuvuosi,lukukausi,kurssinumero
  from kurssi
  where (kurssikoodi,lukuvuosi,lukukausi,kurssinumero)
    not in 
    (select kurssikoodi,lukuvuosi,lukukausi,kurssinumero
    from ilmoittautuminen 
    where perumisaika is null)

Esimerkissä määritellään tyhjä kurssi sellaiseksi kurssiksi, jolle ei ole ilmoittautumisia.

Syitä näkymien käyttöön ovat

Jos kyselyt kohdistuvat näkymiin perustaulujen asemasta, voidaan perustaulujen rakennetta muuttaa ilman, että kyselyjä muutetaan. Perustaulujen muutoksen jälkeen määritellään niihin perustuvat näkymät uudelleen.

Oletetaan, että OPISKELIJA-taulu jaetaan kahdeksi rakenteeltaan alkuperäisen mukaiseksi tauluksi AKTIIVISET ja PASSIIVISET. Nyt tauluun OPISKELIJA kohdistuvat kyselyt eivät enää toimi. Ne saadaan toimimaan kun määritellään näkymä OPISKELIJA seuraavasti

Esimerkki N2. (ks. esimerkkikannan kaavio)

create view opiskelija as

  select * from aktiiviset
  union
  select * from passiiviset

Taulun rakenteen muutoksiin voi varautua määrittelemällä taululle sen kanssa identtisen näkymän.

Esimerkki N3. (ks. esimerkkikannan kaavio)

create view Teacher 
  (opetunnus,sukunimi,etunimet,kotiosoite, 
   tyohuone,tyopuhelin,sahkoposti,kotipuhelin) as
   select opetunnus,sukunimi,etunimet,kotiosoite, 
   tyohuone,tyopuhelin,sahkoposti,kotipuhelin
   from opettaja 

Käyttöoikeudet voidaan antaa näkymiin kohdistuvina. Tällöin oikeudet voidaan rajata taulun joihinkin osiin tai vain yhteenvetotietoihin. Seuraavassa esimerkissä opettajien työosoitetiedot määritellään julkisesti luettaviksi näkymän OPEkautta.

Esimerkki N4. (ks. esimerkkikannan kaavio)

create view ope 
  (sukunimi,etunimet,
   tyohuone,tyopuhelin,sahkoposti) as
   select sukunimi,etunimet, 
   tyohuone,tyopuhelin,sahkoposti
   from opettaja;

grant select on ope to public;

Vaikka tiedot kurssien osallistujista eivät olikaan julkisia voidaan osallistujamäärät silti määritellä julkisiksi seuraavasti

Esimerkki N5. (ks. esimerkkikannan kaavio)

create view osallistujat 
  (kurssinimi, lukuvuosi, lukukausi, koodi, lkm) as
select nimi_suomeksi, kurssi.kurssikoodi, 
  lukuvuosi, lukukausi, count(ilm_aika) opiskelijoita
from opintojakso, 
     kurssi left outer join ilmoittautuminen i 
       on kurssi.kurssikoodi= i.kurssikoodi and
          kurssi.lukuvuosi= i.lukuvuosi and
          kurssi.lukukausi=i.lukukausi and
          kurssi.kurssinumero= i.kurssinumero 
where 
   perumisaika is null and
   opintojakso.kurssikoodi=kurssi.kurssikoodi
group by nimi_suomeksi, kurssi.kurssikoodi, 
   lukuvuosi, lukukausi;

grant select on osallistujat to public;

Näkymien sisältö voidaan määritellä myös käyttäjäriippuvana, esimerkiksi luennoijan kurssit määriteltäisiin seuraavasti

Esimerkki N6. (ks. esimerkkikannan kaavio)

create view omat_kurssit 
  (kurssikoodi,nimi,lukuvuosi,lukukausi,kurssinumero) as
  select kurssikoodi,nimi_suomeksi,lukuvuosi,
    lukukausi,kurssinumero
  from opintojakso,kurssi,opetustehtava,tyo
  where opintojakso.kurssikoodi=kurssi.kurssikoodi and
    opetustehtava.kurssikoodi=kurssi.kurssikoodi and
    opetustehtava.lukuvuosi=kurssi.lukuvuosi and
    opetustehtava.lukukausi=kurssi.lukukausi and
    opetustehtava.tyyppi='luento' and
    opetustehtava.kurssikoodi=tyo.kurssikoodi and
    opetustehtava.lukuvuosi=tyo.lukuvuosi and
    opetustehtava.lukukausi=tyo.lukukausi and
    opetustehtava.kurssinumero=tyo.kurssinumero and
    opetustehtava.opetusnumero=tyo.opetusnumero and
    tyo.opettaja = user
    

Tässä kyselyssä käytetään funktiota user, joka antaa käyttäjän tietokantakäyttäjätunnuksen. Oletetaan, että opettajatunnukset ovat samalla tietokantakäyttäjätunnuksia. Silloin tämä näkymä antaa tyhjän tulostaulun, jos käyttäjällä ei ole luennoitavia kursseja.

Kun taulujen väliset monimutkaiset liitosehdot määritellään valmiiksi näkymiin helpottuu kyselyjen tekeminen. Näkymien käyttö ei kuitenkaan tehosta kyselyjä, sillä näkymiä käytetään siten, että näkymää käyttävässä kyselyssä korvataan näkymä sen määrittelyllä ja sitten laaditaan toteutussuunnitelma tällaiselle muokatulle kyselylle. Tallennettuja johdettuja tauluja (vedoksia, snapshots) käytetään sensijaan juuri kyselyjen tehostamiseen.

Ylläpito näkymien kautta

Joissakin tietokannan hallintajärjestelmissä on mahdollista kohdistaa ylläpito-operaatioita näkymiin. Operaatio kohdistuu tällöin näkymän perustana olevaan perustauluun. Kaikkien näkymien kautta ei voi suorittaa ylläpitoa. Ylläpito-operaatioiden kohteeksi soveltuvat vain sellaiset näkymät, joiden kohdalla on yksiselitteisesti pääteltävissä miten perustaulua on muutettava. Esimerkiksi yhteenvetotietoja sisältäviin näkymiin ei voi kohdistaa ylläpito-operaatioita kuten ei myöskään liitokseen tai yhdisteeseen perustuviin näkymiin.

Ylläpito on yleensä mahdollista vain, jos

 

Takaisin