Objektiteknologian odotetaan tulevaisuudessa muuttavan ratkaisevasti sovellusten toteutusta tuomalla seuraavia etuja:
Oraclen käsityksen mukaan objektiteknologia ei vaikuta pelkästään ohjelmointikieliin ja suunnitteluvälineisiin, se muuttaa myös tietokantatuotteiden toimintaa merkittävästi.
Tarjotakseen objektiteknologiaa hyödyntävän tietokannan tulevaisuudessa kaupalliseen ympäristöön Oracle on asettanut tavoitteekseen rakentaa avoimen ja laajennettavan tietokantapalvelimen joka osaa hallita sekä objektit että perinteisen relaatiotiedon tehokkaasti. Tämä mahdollistaa jo olemassa olevan sovelluskannan käyttämisen myös tulevaisuudessa, kuitenkin antaen asiakkaalle mahdollisuuden hyödyntää objektiteknologiaa tulevissa sovelluskehityshankkeissa.
Toteutus nojautuu Oracle-tietokantaan, jota laajennetaan objektiteknologian vaatimilla piirteillä. Käytännössä tämä tarkoittaa sitä, että objekteista tulee yksi tietokannan perustyyppi muiden perustietotyyppien rinnalle. Objektien luonti, käyttö ja muokkaus tapahtuu joko SQL tai muilla ohjelmointikielillä.
Nykyisin laajat hajautetut tietojärjestelmät perustuvat relaatiomalliin. Seuraavissa kappaleissa käydään läpi miten Oracle laajentaa tuttua relaatiomallia siten, että samassa tietokannassa toimivat sekä relaatiomallin että objektimallin mukaiset sovellukset.
Sovellusten kehittyessä niiden käsittelemä tieto on yhä monimutkaisempaa, mukaan tulevat esimerkiksi teksti, moniulotteinen tieto ja multimedia. Sovelluksen ja tietokannan välillä oleva kerros, joka muuttaa sovelluksen ymmärtämät tietorakenteet relaatiomalliksi, tulee tällöin yhä monimutkaisemmaksi. Lisäämällä tietokantaan objektimallin vaatimat ominaisuudet, tämä välikerros tulee huomattavasti yksinkertaisemmaksi. Samalla virhemahdollisuudet pienenevät ja sovellustyö tehostuu.
Integrointi olemassaoleviin objektipohjaisiin ohjelmointikieliin (C++ ja Smalltalk) halutaan mahdollisimmän läpinäkyväksi, toisaalta Oracle haluaa kuitenkin pysyä ohjelmointikielten suhteen neutraalina joten lähestymistapa tulee olemaan enemmän tietokeskeinen. Tämä mahdollistaa riippumattomien kyselykielien (SQL), riippumattoman tietoluokkien mallintamisen sekä useiden eri objektityövälineiden hyödyntämisen samassa ympäristössä.
Samoin kuin nykyisessä relaatiotekniikkaan perustuvassa ratkaisussa , myös objektitekniikkaan toteutuvassa systeemissä luokkien määrittelytiedot (abstraktit tietotyypit) talletetaan tietokannan kuvaustauluihin, joita voidaan käsitellä SQL-kielellä, ohjelmointikielillä sekä työkaluilla dokumentoidun ohjelmarajapinnan kautta. Avoimet tietotyypit antavat käyttäjälle mahdollisuuden luoda omia tietotyyppejä olemassa olevien tietotyyppien rinnalle. Lisäksi objektien käyttäytymissäännöt (metodit) voidaan sisällyttää tietotyyppeihin (attribuutit), mikä mahdollistaa abstraktien tietotyyppien luomisen.
Objektilaajennuksia relaatiomalliin
Uuden ANSI-standardin myötä SQL-kieleen tulee myös objektipiirteet mukaan. Oracle laajentaa omaa SQL-kieltään siten, että se tukee SQL3-standardin mukaista kieltä. Tämän myötä Oracle-tietokantaan tulee seuraavat objektilaajennukset:
Objektien kuvaaminen tietokantaan perustuu SQL3 standardin abstraktien tietotyyppien määrittelyyn. Objekteilla on seuraavat ominaisuudet
Abstrakti tietotyyppi voi olla myös taulun tyyppinä tai taulun sarakkeen tyyppinä. Abstrakti tietotyyppi taulun sarakkeen tyyppinä voi olla joko objektin arvo (sisältö) tai viittaus objektiin. Jokaiselle objektille (instansille) järjestelmä generoi automaattisesti yksikäsitteisen objektitunnuksen. Abstrakteja tietotyyppejä voidaan hyödyntää myös SQL-kielestä. Abstraktin tietotyypin luominen tapahtuu CREATE TYPE -komennolla, samassa yhteydessä voidaan määritellä objektin alustamiseen tarvittava metodi (konstruktori) sekä tuhoamiseen tarvittava metodi (destruktori). Lisäksi kaikki objektin käsittelyyn tarvittavat metodit voidaan kuvata CREATE TYPE -komennossa. Ohessa yksinkertainen esimerkki:
CREATE VALUE TYPE osoite_tyyppi ( katu VARCHAR2(40), kaupunki VARCHAR2(30), postinumero CHAR(5) ); MEMBER FUNCTION muotoile_osoite RETURN VARCHAR2 CREATE VALUE TYPE henkilo_tyyppi(....); CREATE TABLE toimittaja ( id VARCHAR2(8), nimi VARCHAR2(40), tyyppi CHAR(1), yhteyshenkilo henkilo_tyyppi, osoite osoite_tyyppi, puhelin NUMBER(10));
CREATE TYPE-komennon lisäksi tarvitaan DROP TYPE -komento abstraktien tietotyyppien poistamiseen järjestelmästä, ALTER TYPE tietotyyppien ominaisuuksien muuttamiseen sekä GRANT/REVOKE TYPE komennot objektien käyttöoikeuksien määrittelyyn. On syytä huomata, että koska abstraktit tietotyypit ovat tietokannan objekteja, niihin voidaan kohdistaa samat käyttöoikeussäännöt kuin perinteisiin relaatiomallin mukaisiin tietoihinkin.
Objektin metodit voidaan toteuttaa joko Oraclen PL/SQL-kielellä tai yleisillä ohjelmointikielillä, käyttäen hyväksi CallBack -ominaisuutta.
Objektitaulut on vartavasten objektien arvojen (instanssien) tallentamiseen tarkoitettuja tauluja.
CREATE VALUE TYPE nimi_tyyppi(....); CREATE OBJECT TYPE osasto_tyyppi (......); CREATE EXTENT TABLE osasto FOR osasto_tyyppi; CREATE OBJECT TYPE henkilo_tyyppi ( id NUMBER(5), nimi nimi_tyyppi, puhelin NUMBER(10), osasto osasto_tyyppi); CREATE EXTENT TABLE tyontekijat FOR henkilo_tyyppi; CREATE OBJECT TYPE tuote_tyyppi ( id VARCHAR2(8), vastuuhenkilo henkilo_tyyppi, kuvaus VARCHAR2(50), status CHAR(1), hinta NUMBER(9,2), ostohinta NUMBER(9,2), tuki CHAR(2)); CREATE EXTENT TABLE tuotteet FOR tuote_tyyppi;
SQL-kieleen tarvitaan laajennuksia, jotta myös objektien käsittely SQL-komennoista olisi mahdollista. Ensimmäinen merkittävä uusi piirre on objekteihin viittaaminen SQL-kielessä. Koska objektit voivat sijaita toisten objektien sisällä, eikä tälle sisäkkäisrakenteelle ole rajaa olemassa, tarvitaan yleiskäyttöinen tapa ilmaista objekteja. Tämä toteutetaan luettelemalla sisäkkäiset objektit peräkkäin ja erottamalla eri objektit toisistaan pisteellä, esimerkiksi TOIMITTAJA.OSOITE.KAUPUNKI.
INSERT INTO toimittaja VALUES ('90123456','OY YRITYS AB',NULL, nimi_tyyppi('Myyntitykki','Matti'), osoite_tyyppi('Tehdastie 5','Peräkykä','12345'), 99912345);
Oheinen esimerkki osoittaa, miten SQL INSERT -komennolla voidaan lisätä skalaaritietoa ja abstrakteja tietotyyppejä perinteiseen relaatiotauluun. Vastaava komento lisättäessä tietoa objektitauluun voisi olla esimerkiksi:
INSERT INTO osasto VALUES ( osasto_tyyppi(12345,'VARASTO',NULL));
Kummassakin tapauksessa käytetään hyväksi objektiteknologian konstruktrori-käsitettä, joka takaa sen että objekti alustetaan abstraktin tietotyypin kuvauksen mukaisesti.
Sekä yhteyshenkilö että osoite ovat objekteja, mutta niitä voidaan käyttää hyväksi kyselyissa. Seuraava esimerkki etsii kaikki erinomaiseksi luokitellut toimittajat, joiden yhteyshenkilö on Oskari Ostaja.
SELECT nimi, osoite.kaupunki, tyyppi FROM toimittaja WHERE tyyppi = 'E' AND yhteyshenkilo = nimi_tyyppi('Ostaja','Oskari') ORDER BY osoite;
Kuten esimerkistä ilmenee, objekteihin voidaan viitata monella eri tavalla kyselyssä.
Objekteja voidaan käyttää hyväksi myös ehtolauseissa, kuten oheinen esimerkki osoittaa.
SELECT v1.nimi,v2.nimi FROM toimittaja v1, toimittaja.v2 WHERE v1.osoite = v2.osoite
Objektimalli mahdollistaa myös sisäkkäisten taulujen käyttämisen. Tämän avulla voidaan tallettaa luonnollisella tavalla hierarkisia tietorakenteita. Oheinen esimerkki kuvaa tuotetaulua, jossa tuote voi koostua osista (jotka myös on talletettu samaan tauluun).
CREATE OBJECT TYPE komponentti_tyyppi ( id tuote_tyyppi, component_of component_type, kpl number(7,2), osat TABLE(rakenne komponentti_tyyppi));
Tämän jälkeen monimutkaisetkin tuoterakennetta koskevat kyselyt ovat mahdollisia. Esimerkiksi kaikki tuotteen BU034567 kokoamiseen tarvittavat komponentit saadaan kyselyllä:
SELECT c.object_column.id.id, c.object_column.id.kuvaus, (SELECT rakenne.id.id, rakenne.id.kuvaus FROM rakenne) FROM komponentti c WHERE c.object_column.id.id = 'BU034567'; Objektinäkymä relaatiomallin päälle
Sen lisäksi, että tietokantaan voidaan tallettaa objekteja, olemassa olevan relaatiomallin päälle voidaan luoda objektimalli (objektinäkymä). Objektinäkymän kautta voidaan päivittää ja käyttää hyväksi relaatiomallin tietoja aivan kuten ne olisivat objekteja. Tämä mahdollistaa olemassa olevien relaatiotietorakenteiden hyödyntämisen myös objektiteknologian mukaisista työvälineistä käsin. Objektinäkymät voivat pitää takanaan myös Oraclen Gateway-tuotteet, jolloin varsinainen tieto voi olla jopa jossakin ei-Oracle tietokannassa.
Oracle7 tänään
Oracle7 tietokanta pitää jo nyt sisällään eräitä objektiteknologian mukaisia ominaisuuksia. Tietokantaan voidaan tallettaa proseduureja käyttäen PL/SQL ohjelmointikieltä. PL/SQL -kieliset proseduurit jakaantuvat kahteen osaan; Package Specification sisältää proseduurin määrittelyn eli sen julkisen, kaikille näkyvän osuuden. Määrittelyosa pitää sisällään julkiset muuttujat sekä kaikkien käytettävissä olevat funktiot ja aliohjelmat (= metdodit).
Package Body sisältää varsinaisen koodin toteutuksen, joka on täysin piilossa modulin käyttäjiltä. Funktioiden ja proseduurien nimissä voidaan käyttää hyväksi operator overloading -tekniikkaa, eli samannimisiä proseduureja mikäli vain niiden parametrilistat eroavat toisistaan. Mikäli toteutusta halutaan muuttaa (package body), riittää kun sitä modifioidaan ja käännetään se uudelleen sekä talletetaan tietokantaan. Kaikki sovellukset, jotka käyttävät modulia määrittelymodulin kautta, säilyvät ennallaan.
Arto Leinonen, tuotepäällikkö, Oracle Finland Oy