Oracle -tietokanta ja objektiteknologia

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ä.

Relaatiomallin muuttuminen objektimalliksi

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ä.

Avoin tietotyyppien käsittely

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:

  1. Abstraktit tietotyypit
  2. Objektilaajennukset SQL, PLSQL, OCI-rajapintaan ja Pro*C esikääntäjiin
  3. Taulukot ja sisäkkäiset taulut
  4. Objektinäkymät
  5. Metodien toteutus 3GL ohjelmointikielellä

Abstraktit tietotyypit

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

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;

Objektien käsittely SQL-kielessä

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

Sisäkkäiset objektitaulut

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