Duomenų bazės ir semantiniai modeliai

Konceptualaus projektavimo fazėje modeliuojama vartotojų informacija bei jos apdorojimas. Šioje fazėje naudojami trys pagrindiniai semantiniai modeliai – objektinis, EER- ir reliacinis duomenų modeliai. Šie modeliai yra neutralūs, neorientuoti į konkretų DBVS palaikomą modelį. Reikalavimų analizės fazėje giliai analizuojama organizacijos veikla ir rezultate tiksliai aprašomos atskirų vartotojų grupių funkcijos. Tačiau duomenų struktūros paprastai lieka netiksliai apibrėžtos, neformalizuotos. Konceptualaus projektavimo fazėje formalizuojami semantiniai sąryšiai tarp taikomosios srities sąvokų, panaudojant tam tikrą vieną ar net kelis semantinius duomenų modelius.

1.1. Išplėstasis Esybių – Ryšių modelis

Semantiniai duomenų modeliai naudojami duomenų koncepcinio modeliavimo lygmenyje. Kadangi koncepcinis modeliavimas nepriklauso nuo loginės ir fizinės duomenų modelio realizacijos, todėl jis išlaisvino vartotojus ir sistemų analitikus nuo poreikio domėtis duomenų modeliais, kurie nėra tokie natūralūs. Originalus Esybių – Ryšių modelis [1], kurį pasiūlė Čenas (Chen) 1970 – ųjų viduryje laikomas vienu pirmųjų semantinių modelių, kartu su Abrial binariniu duomenų modeliu bei Smitų (Smith J. ir Smith D.) modeliu, įvedusiais pirmakart griežtai apibrėžtas apibendrinimo ir agregavimo kategorijas. Pradinis ER modelis neturėjo apibendrinimo-specializavimo hierarchijos, tačiau jis nuolat buvo keičiamas ir plečiamas. Pagaliau buvo išvystytas Išplėstasis Esybių – Ryšių modelis (EER), kuriame be agregavimo ryšio jau naudojamos apibendrinimo- specializavimo arba yra ryšys. Šis modelis yra labiausiai ir plačiausiai priimtas, kaip RDB schemų standartas. Jis leidžia grafiškai pavaizduoti modelio konstrukcijas ir yra plačiai naudojamas automatizuotose programų kūrimo priemonėse, pvz. DB-MAIN sistemoje [2], kurios grafinę notaciją naudosime tolimesniame EER modelio nagrinėjime.
1.1.1. Esybių tipai
Esybės tipas arba tiesiog esybė – tai konkrečių arba abstrakčių realaus pasaulio daiktų ar objektų aibė, apie kurią turi būti surinkta ir saugoma informacija. Esybė gali būti naudojama ir duomenų konstrukcijoms (įrašų tipams, lentelėms, segmentams ir kt.) aprašyti. Konkreti interpretacija priklauso nuo schemos abstrakcijos lygio. Esybėms vaizduoti naudosime grafinį žymėjimą (1.1 pav.). Esybės tipą atstovauja jos vardas. Esybė turi savo egzempliorius (žr. 1.2 pav.). Objektų aibė turi būti vaizduojama tik viena esybe. Esybės apibūdinamos atributais ir gali turėti vientisumo vidinius apribojimus. Esybė TIEKĖJAS turi du atributus VARDAS ir ADRESAS ir vieną vidinį apribojimą id:VARDAS.

1.1 pav. Grafinis esybės pavaizdavimas.

Esybės pavadinimas atstovauja pačio objekto tipui. Esybės turi savo egzempliorius. Objektų grupė turi būti vaizduojamas tik viena esybe. Esybės apibūdinamos atributais ir gali turėti vientisumo vidinius apribojimus.
Atributas – tai esybės detalė, kuri išreiškia kokybines arba kiekybines esybės savybes. Atributai turi savo reikšmes, kuriomis esybės egzemplioriai identifikuojami ir klasifikuojami. Atributai su savo reikšmėmis charakterizuoja esybės būseną tam tikru laiko momentu. Esybės TIEKĖJAS (žr. 1.2 pav.) du egzemlioriai identifikuojami atributo VARDAS reikšmėmis STRAUJA ir KSC, nes jos egzemplioriams (vientisai per visą egzempliorių aibę) bet kuriuo laiko momentu (nepriklausomai nuo esybės būsenos) yra unikalios. Identifikavimo sąlygos užduodamos apribojimu id:VARDAS. Atributai gali būti paprastieji ir sudėtiniai. Paprastieji atributai pažymi vieną, elementarią esybės savybę. Sudėtiniai atributai yra sudaryti iš paprastųjų. Esybė VYKDYTOJAS turi (žr. 1.3 pav.) du sudėtinius atributus VARDAS ir ADRESAS: VARDAS susideda iš paprastujų atributų FIRMOS_KODAS ir PAVADINIMAS, o ADRESAS susideda iš atributų MIESTAS, GATVĖ ir NAMO_NR. Esybių identifikavimui gali būti panaudotas vienas pirminis raktas ir vienas ar keli antriniai raktai. Esybių identifikavimui panaudotas raktas gali susidėti iš vieno ar kelių atributų – sudėtinių ir/arba paprastųjų. 1.2 paveiksle parodyta esybė TIEKĖJAS turi vieną pirminį raktą VARDAS. Šis atributas yra paprastasis. 1.3 paveiksle parodyta esybė VYKDYTOJAS turi du identifikatorius – pirminį raktą VARDAS ir antrinį raktą BANKAS. Abu atributai VARDAS ir BANKAS yra sudėtiniai atributai.

1.2 pav. Esybė TIEKĖJAS ir jos du egzemplioriai
Kardinalumas [1-1] grafiškai nepavaizduojamas ir priimamas pagal nutylėjimą. 1.3 paveiksle atributai GATVĖ, NAMO_NR ir TELEFONAS yra neprivalomi. Atributas TELEFONAS gali įgyti iki penkių reikšmių. Esybei VYKDYTOJAS nurodyti trys vidiniai apribojimai Id, Sambūvis ir Bent-1., galiojantys vientisai per visą egzempliorių aibę. Konstrukcija Id:VARDAS užduodamas esybęs identifikatorius. Aributai GATVĖ ir NAMO_NR yra neprivalomi, tačiau bet kuriam egzemplioriui šių atributų reikšmės kartu turi būti arba užduotos, arba neužduotos – to reikalauja apribojimas Sambūvis. Atributai FIRMOS_KODAS ir PAVADINIMAS yra taip pat neprivalomi, tačiau apribojimas Bent-1 reikalauja, kad bent viena iš šių atributų reikšmių kiekvienam esybės egzemplioriui turi būti užduodama. Be vidinių vientisumo apribojimų Sambūvis ir Bent-1, kurie buvo iliustruoti pavyzdžiais, neprivalomų atributų atžvilgiu dar naudojami tipiniai apribojimai Išskirtinis ir Tiksliai-1. Išskirtinumo apribojimas Išskirtinis užduodamas dviejų atributų atžvilgiu, ir šiuo atveju apribojimas reikalauja, kad kiekvienam esybės egzemplioriui gali būti užduota tik vieno iš dviejų neprivalomų atributų reikšmė. Apribojimas Tiksliai-1 užduodamas kelių atributų atžvilgiu (daugiau kaip dviejų) ir, kaip ir išskirtinumo atveju Išskirtinis, pareikalaujama, kad kiekvienam esybės egzemplioriui tik vienas iš nurodytų neprivalomų atributų įgytų savo reikšmę.

1.3 pav. Esybė VYKDYTOJAS su užduotais neprivalomais atributais ir vientisumo apribojimais

1.1.2. Ryšiai ir esybių rolės

Ryšio tipas arba tiesiog ryšys – tai prasminis santykis tarp esybių. Ryšio tipą sudaro esybių tipai su rolėmis, o rolės sieja ryšio tipą su esybe. Jeigu ryšyje dalyvauja daugiau nei du esybių tipai, tai toks ryšys vadinamas daugianariu (
1.4a pav.). Ryšio tipas, kuris sieja dvi esybes, vadinamas binariniu (
1.4b pav.). Ryšio tipas, siejantis tą pačią esybę, vadinamas cikliniu arba rekursyviu, ir jis paprastai naudojamas esybių-egzempliorių hierarchijoms vaizduoti (
1.4c pav.). Ryšio tipai gali turėti atributų. Ryšio tipas UŽSAKYMAS (2.3a pav.) turi vieną atributą KIEKIS. Esybių rolės turi savo vardus. Jeigu ryšio tipo esybės rolės vardas nenurodytas, tai jis sutampa su esybės vardu. 2.3c pav. parodytas atvejas, kai ryšio nuoroda esybė KNYGA turi dvi roles Į ir Iš. Esybės rolė gali turėti vardą. Rolės turi būti įvardintos skirtingais vardais, todėl rekursinio ryšio tipo atveju bent vienai rolei turi būti suteiktas vardas, o kita gali paveldėti esybės tipo pavadinimą. Paprastai viena esybė susieta viena role su ryšio tipu, tačiau galimas toks variantas, kai ta pačia role yra susietos kelios esybės su tuo pačiu ryšio tipu. Šiuo atveju rolė yra vadinama n- esybių tipų (n-ET) role (žr.2.3d pav.). n-ET tipo rolės turi būti įvardintos.

1.4 pav. Ryšių tipų pavyzdžiai

Rolės yra charakterizuojamos jų intervaliniu kardinalumo laipsniu [i-j]; 0  i  N; 0  i  M . Ši rolės savybė nurodo, kiek kartų (nuo i iki j) esybės egzempliorius gali būti susietas šia role su ryšio tipu. Kardinalumo laipsnio galimos reikšmės N ir M yra sveikaskaitinės ir turi prasmę “daug”. Pateiksime ryšio R esybės A rolės K kardinalumų [i-j] pavadinimus galimiems atvejams (žr. 1.1 lent.). Jeigu ryšys R yra binarinis, jungiantis tarpusavyje dvi esybes A ir B, ir nesemantizuotas (t.y. jis neturi savo vardo ir savo atributų), tai EER diagramose ryšio vardas nenurodomas. Tokiu atveju esybės A ir B asocijuojamos betarpiškai per menamą ryšį R; jų rolės (įvardintos, ar neįvardintos) kaip ir anksčiau charakterizuojamos kardinalumo laipsniu [i-j] (žr. 1.5 pavyzdį).

1.1 lentelė.Rolių kardinalumai
Pavadinimas Žymėjimas Sąlygos
vienas – su – vienu 1-1 i = j = 1
vienas – su – daug 1-M (i = 1)  (j > 1)
daug – su – daug N-M (i > 1)  (j > 1)
neprivalomas A tipui 0-1, 0-M (i = 0)  (j  0)
privalomas A tipui 1-1, 1-M (i > 0)  (j  0)

1.5 pav. EER diagramos pavyzdys, kuriame nėra specifikuotų ryšių tipų

Binariniai ryšiai be atributų ir turintys esybės B rolę su kardinalumu [1-0] arba [1-1] vadinami funkciniais, kadangi tokiu atveju tarp esybių-egzempliorių aibių B ir A egzistuoja funkcija-atvaizdas R: B  A. 1.6 paveikslėlyje pateiktas pavyzdys su funkciniu ryšiu tiekimas: UŽSAKYMAS  PRODUKTAS.

1.6 pav. EER diagramos pavyzdys su funkciniu ryšiu tiekimas ir išorine ref- priklausomybe

Be nagrinėtų ryšių tipų prie išorinių apribojimų priskirsime dar išorinio rakto priklausomybes, kurias sudaro nuorodos. Nuoroda sujungia tarpusavyje vienos esybės atributą (išorinį raktą) su kitos esybės pirminiu arba papildomu raktu. Schemose išorinio rakto priklausomybė žymima simboliu ref. 1.6 paveiksle parodyta ref- priklausomybė reikalauja, kad esybės UŽSAKYMAS atributo PRODUKTAS reikšmė bet kuririam esybės egzemplioriui būtų paimta (“importuota”) iš kitos esybės PRODUKTAS pirminio rakto VARDAS panaudotų reikšmių aibės.Tuo atveju, kai ref- priklausomybė yra sustiprinta papildomu reikalavimu, kad svetimo rakto atributo (duotame pavyzdyje PRODUKTAS) visų panaudojamų reikšmių aibė per visus esybės UŽSAKYMAS egzempliorius sutaptų su “importuojamų” esybės PRODUKTAS rakto VARDAS reikšmių aibe, tai ref- priklausomybė vadinama ekvivalentiškumo priklausomybe ir žymima ne ref, o equ.

1.1.3. isa ryšio apibrėžimas

isa ryšių semantika skiriasi įvairių autorių modeliuose. Todėl apibrėšime, kurią semantiką toliau naudosime, apibrėždami dvi funkcijas – pset ir vset.
pset(E) funkcija grąžina visas esybės tipo E struktūrines savybes, t.y. tipo E atributus, roles ( kartu su išoriniais ryšiais, kuriuose E dalyvauja) ir vientisumo apribojimus (vidinius, užduodamus esybės E atributų atžvilgiu ir išorinius, užduodamus esybės E atributų ir kitos esybės E’ atributų atžvilgiu). pset funkcija nepriklauso nuo laiko, nes ignoruojame struktūrinę duomenų bazės evoliuciją.
Imkime du esybių tipus E ir G. pset(E) * pset(G), jei kiekvienas E atributas taip pat yra ir G atributas, kiekviena E išorinio ryšio rolė yra taip pat ir G rolė ir kiekvienas esybės tipo E vientisumo ribojimas galioja esybės tipui G. Pateiksime išraiška pset(E) * pset(G) užduodamus reikalavimus griežtesnėje formoje.
*a * aset(E) , *b * aset(G) :
name(b) = name (a) = A * card(b) = card(a) * dom(b) = dom(a) ;
*r * rset(E) , *s * rset(G) :
name(s) = name (r) = R * card(s) = card(r) ;
*i * cset(E) , *j * cset(G) :
type(j) = type(i) = I * j * i .

aset(E) – esybės tipo E atributų aibė;
name(K) – schemos komponento K pavadinimas;
card(r) – atributo r arba rolės r kardinalumas;
dom(a) – atributo a reikšmių sritis;
rset(E) – esybės tipo E rolių aibė;
cset(E) – esybės E vientisumo apribojimų aibė;
type(i) – vientisumo ribojimo i tipas.

vset(E) funkcija grąžina esybės tipo E esybes (esybes-egzempliorius); šios funkcijos rezultatas yra priklausomas nuo laiko, tačiau traktuosime ją sinchroniškai, t.y. fiksuosime rezultatą tam tikru laiko momentu ir ignoruosime jos evoliuciją.
Paėmę tuos pačius esybių tipus E ir G apibrėšime priklausomybės vset(E) * vset(G) reikalavimus. vset(E) * vset(G), jei kiekvienas esybės tipo E egzempliorius yra ir G esybės tipo egzempliorius.

1.7 pav.Priklausomybių pset(E) * pset(G) ir vset(E) * vset(G) grafinis vaizdavimas

Apibrėžę vset ir pset funkcijas užduosime isa priklausomybės išvedimo taisyklę tokiu būdu:
pset(E) * pset(G)  vset(E) * vset(G)  G isa E

Ši išvedimo taisyklė parodyta 1.8 paveiksle. Čia paprastumo dėlei “apatinei” esybei G pasikartojantys atributai, rolės ir apribojimai (A, R ir I) nespecifikuojami ir traktuojami kaip esybės E paveldimos savybės.

1.8 pav. isa priklausomybės išvedimas

Jeigu turime išvestą priklausomybę GisaE (išvedimo taisyklė grafiškai parodyta 1.9a pav.), tai šioje priklausomybėje tipas G vadinamas sub-tipu arba sub-esybe, o E vadinamas super-tipu arba super-esybe. Sakykime, kad G ir E yra du tos pačios dalykinės srities esybių tipai su užduota priklausomybe GisaE (1.9b pav.). Ši priklausomybė gali būti interpretuojama kaip struktūrinis apribojimas duomenų bazės duomenims:
G isa E  vset(G)  vset(E) * pset(E) * pset(G)

1.9 pav. isa priklausomybės išvedimas koncepcinėje schemoje (a) ir šios priklausomybės interpretavimas kaip apribojimo duomenų bazės duomenims (b)

Pažymėtina, kad isa ryšiai yra kitaip traktuojami objektiškai orientuotame programavime. Šio ryšio traktavimą galima charakterizuoti taip:
G isa E * pset(E) * pset(G) .

1.1.4. isa ryšių klasifikavimas

Apibrėšime du naujus subtipų apribojimus, žyminčius visumą ir suskaidymą. Duoti esybės tipas E ir esybių tipų aibė G = G1, G2,…, Gn} tokia, kad *Gi * G, Gi isa E, tada: aibė G yra pilnoji (arba G dengia E), jei *e * vset(E), *Gi * G : e * vset(Gi). Kitaip B yra dalinė.
• aibė G yra nesikertanti, jei * Gi, Gj * G; Gi * Gj * vset(Gi) * vset(Gj) = *. Kitaip G yra persikertanti.
Šios savybės nuo laiko nepriklauso ir galioja kiekvienam duomenų bazės egzemplioriui.
Taigi pagal subtipų aibės G savybes įvesime subtipų apribojimus. Teigsime, isa ryšis bus :
• pilnasis, jei subtipų aibė G yra pilnoji ir persikertanti, žymimas – T;
• išskirtinumo, jei subtipų aibė G yra dalinė ir nesikertanti, žymimas – D;
• suskaidymo, jei subtipų aibė G yra pilnoji ir nesikertanti, žymimas – P;
• laisvasis, jei subtipų aibė G yra dalinė ir persikertanti.
Šių apribojimų grafinė notacija pateikta 1.10 pav.; čia: G = G1, G2}.

1.10 pav. Subtipų apribojimų grafinė notacija.

Supertipai gali turėti daugiau nei vieną subtipų grupę. Pavyzdžiui, esybės tipo ASMUO egzemplioriai gali būti skirstomi į VYRUS ir MOTERIS, taip pat į DARBININKUS ir TARNAUTOJUS (1.11 pav.). Čia galime išskirti dvi isa hierarchijas su bendru supertipu ASMUO – vieną P tipo su subtipų grupe {VYRAS, MOTERIS} ir vieną D tipo su subtipų grupe {DARBININKAS, TARNAUTOJAS}. Mūsų pavyzdyje esybės ASMUO egzemplioriai pirmojoje hierarchijoje skirstomi į esybės VYRAS arba esybės MOTERIS egzempliorius; aibių VYRAS ir MOTERIS egzemplioriai kartu paėmus sudaro visą aibę ASMUO. Antrojoje hierarchijoje esybės ASMUO egzemplioriai gali būti priskirti arba esybei DARBINIKAS arba esybei TARNAUTOJAS, tačiau aibių DARBININKAS ir TARNAUTOJAS nesudaro visą aibę ASMUO.

1.11 pav. Subtipų grupių pavyzdys.
Bendru atveju kiekviena subtipų grupė yra disjungcijoje su kitomis to paties supertipo grupėmis: mūsų pavyzdyje egzempliorius iš aibės VYRAS negali būti aibės MOTERIS elementu, tačiau gali priklausyti aibei DARBININKAS arba aibei TARNAUTOJAS. Nesileisdami į detales pažymėsime, kad subtipų kelių skirtingų grupių atveju egzempliorius galima pergrupuoti ir sudaryti iš kelių hierarchijų vieną isa hierarchiją. Pavyzdžiui, 1.11 pav. pavaizduotos grupės gali būti pakeistos viena grupe, susidedančia iš keturių subtipų: VYRAS-TARNAUTOJAS, MOTERIS-TARNAUTOJA, VYRAS-DARBININKAS, MOTERIS-DARBININKĖ (1.12 pav.). Tačiau čia pasireiškia semantiniai nuostoliai: asmuo, nebūdamas tarnautoju arba darbininku bus priskiriamas tik supertipui ASMUO, tačiau neliks informacijos, ar jis yra vyras, ar jis yra moteris.

1.12 pav. Subtipų grupių pavyzdys.

Literatūroje paskelbtuose modeliuose IS-A sąryšiai yra traktuojami skirtingai. Pavyzdžiui, predikatinio arba apribotojo IS-A sąryšio atveju [6] subtipai yra išvedami iš predikato, žyminčio subtipą, kuriam priklauso supertipo egzempliorius (1.13 pav.).

1.13 pav. P-tipo IS-A sąryšio pavyzdys.

Tačiau šis semantinis primityvas toliau nebus nagrinėjamas, nes ji pasižymi semantiniu pertekliškumu:
*a * pop(ASMUO),
(p.LYTIS = “V” * p * pop(VYRAS)) * (p.LYTIS = “M” * p * pop(MOTERIS))
Tas pats tipas A gali būti subtipu kelių supertipų atžvilgiu. Tada sakysime, kad tipas A yra daugialypiame isa ryšyje su kitais supertipais. DIRBANTIS_STUDENTAS (žr. 1.14 pav.) yra daugialypiame isa ryšyje su supertipais ASMUO ir STUDENTAS. Tada esybė DIRBANTIS_STUDENTAS paveldi tiek esybės ASMUO, tiek esybės STUDENTAS visas savybes, ir kiekvienas egzempliorius iš aibės DIRBANTIS_STU-DENTAS priklauso abiem aibėms aibėm ASMUO ir STUDENTAS.

1.14 pav. Daugialypio isa ryšio pavyzdys.

Isa ryšys pasižymi tranzityvumu: jei A isa B ir B isa C, tai A isa C. Jei DIRBANTIS_STUDENTAS isa STUDENTAS ir STUDENTAS isa ASMUO, tai DIRBANTIS_STUDENTAS isa ASMUO (žr. 1.15 pav.). Šiuo atveju DIRBANTIS_STU-DENTAS paveldės ne tik esybės STUDENTAS savybes, bet ir esybės ASMUO savybes, ir kiekvienas esybės DIRBANTIS_STUDENTAS egzempliorius priklausys ne tik aibei STUDENTAS, bet ir aibei ASMUO.

1.15 pav. Ryšys DIRBANTIS_STUDENTAS isa ASMUO yra išvestas iš kitų dviejų isa ryšių

1.1.5. EER diagramų transformavimas

Schemos transformacija yra toks operatorius, kuris keičia schemos S konstrukciją C kita konstrukcija C’ ir gaunama nauja schema S’. Konstrukcija C’ yra gaunama iš konstrukcijos C per transformaciją T, t.y. C’=T(C). Šį apibrėžimą galima pailiustruoti plačiai naudojamu schemos transformavimo pavyzdžiu (2.9 pav.), kai binarinis sąryšis UŽSAKYMAS keičiamas esybės tipu UŽSAKYMAS ir dvejais “vienas – su – daug” ryšio tipais KU ir FU. Norint tiksliau apibrėžti schemų transformacijas, įvesime papildomą transformaciją t, kuri nurodo kaip C konstrukcijos egzemplioriai yra pavaizduojami konstrukcijos C’ egzemplioriais: jei c yra C egzempliorius, tai c’ = t(c) yra C’ egzempliorius. Transformaciją žymėsime: * = .
Įvesime semantiką išsaugančios transformacijos apibrėžimą: transformacija yra semantiką išsauganti arba abipusė, jei schemos S ir S’ aprašo tą pačią realaus pasaulio dalį. Tiksliau, jei *1= yra abipusė transformacija, tai turi egzistuoti tokia transformacija *2=, kad bet kokiai konstrukcijai C ir jos egzemplioriui c galioja sąlyga:
[T2(T1(C))=C] * [t2(t1(c))=c]
Egzistuoja aukštesnės eilės abipusė transformacija. S1 ir S2 yra vadinamos simetriškai abipusėmis transformacijomis, jei :
bet kokiai konstrukcijai C ir jos egzemplioriui c galioja sąlyga:
[T2(T1(C))=C] * [t2(t1(c))=c],
bet kokiai konstrukcijai C’ ir jos egzemplioriui c’ galioja sąlyga:
[T1(T2(C’))=C’] * [t1(t2(c’))=c’].
Kai kurie autoriai [7] schemų transformavimą siūlo naudoti kaip pagrindinį duomenų bazių projektavimo įrankį.
1.1.5.1. Ryšio tipo transformavimas į naujos esybės tipą

2.9 pav. Standartinė transformacija: ryšio tipo pavaizdavimas esybės tipu.

1.1.5.2. Neutralios transformacijos panaikinančios IS-A sąryšius

Abipusės transformacijos leidžia eliminuoti IS-A sąryšius, t.y. leidžia pavaizduoti juos standartinėmis EER konstrukcijomis, tokiomis, kaip ryšio tipai, atributai ir apribojimai. Šis būdas vadinamas neutraliu, nes jis nepriklauso nuo konkrečios DBVS. Literatūroje yra žinomi trys pagrindiniai IS-A sąryšių eliminavimo būdai [8]. Toliau pateiksime šių metodų aprašymą, iliustruotą nedideliu abstrakčiu pavyzdžiu, susidedančiu iš esybės supertipo A, subtipų B ir C su atributais, tačiau be ryšio tipų ir apribojimų.
Pirmasis būdas: Pavaizdavimas ekvivalenčiais IS-A sąryšiais
Šis metodas yra vienas iš populiariausių. Jo esmė yra ta, kad kiekvienas subtipas yra pavaizduojamas nepriklausomais esybės tipais, kurie sujungiami ryšio tipu su esybe – supertipu (2.10 pav.). Ryšio tipo kardinalumas – “vienas – su – vienu”. Pagrindinis šio metodo privalumas yra tas, kad jo grafinis pavaizdavimas yra labai panašus į pradinę schemą su IS-A sąryšiu: visos esybės yra tiksliai išsaugomos, o IS-A sąryšio saitai keičiami ryšio tipais. Pagrindinis šio metodo trūkumas yra tas, kad esybių tipai yra pavaizduojami fragmentuotai: subtipai pavaizduojami mažiausiai dviem esybių tipais. Šis būdas prieštarauja populiariai duomenų bazių aksiomai, kuri teigia, kad kiekvienas elementarus faktas turi būti pavaizduotas vienu informacijos konceptu. Kai kurie autoriai [12] įtraukia tipo atributą (su apibrėžimo sritimi {‘B’,’C’}) į esybės supertipo A atributų aibę. Šis atributas naudojamas pažymėti, kuriam subtipui priklauso supertipo A egzempliorius.

2.10 pav. Pavaizdavimas ekvivalenčiais IS-A sąryšiais.

Antrasis būdas: Pavaizdavimas supertipu
Šis metodas pavaizduoja tik esybę supertipą, esybės subtipai nepavaizduojami (2.11 pav.). Siekiant išsaugoti pradinės schemos informaciją, visos subtipų charakteristikos (atributai, ryšio tipai ir apribojimai) perkeliamos į supertipą. Pažymėsime, kad esybės tipo B atributai (taip pat ir C) pavaizduojami nebūtinu sudėtiniu atributu esybėje supertipe A. Šis pavaizdavimo būdas yra išvedamas iš pirmojo transformuojant esybių tipus B ir C į esybės tipo A atributus B ir C. Šis atvejis, kai naudojami sudėtiniai nebūtini komponentai (čia atributai), yra sudėtingesnis. Sudėtinius komponentus galima palyginti su PASCAL ar C programavimo kalbų įrašų tipų struktūromis. Pagrindinis metodo privalumas: atliekant duomenų apie supertipą išrinkimus iš duomenų bazės išvengiama skirtingų lentelių sujungimo į vieną, tai užima daug laiko. Pagrindinis trūkumas: schema tampa neaiški, o programavimas sudėtingesnis.

2.11 pav. Pavaizdavimas supertipu.

Trečiasis būdas: Pavaizdavimas subtipais
Šis metodas transformuoja tik esybes subtipus ir supertipo charakteristikas perkelia kiekvienam subtipui (2.12 pav.). Kai esybės subtipai nesudaro pilnosios supertipo aibės, yra išskiriamas naujas esybės tipas A su supertipo savybėmis. Jis pavaizduoja egzempliorius, kurie nepriklauso nei vienam iš subtipų. Metodo privalumas yra tas, kad visa informacija apie subtipus saugoma atskirai ir tuo išvengiama skirtingų lentelių sujungimo į vieną, kai norima atlikti duomenų išrinkimą iš duomenų bazės apie subtipą, tai pagreitina duomenų apdorojimą. Pagrindinis trūkumas: duomenų dubliavimas, sudėtingas duomenų apie supertipą išrinkimas.

2.12 pav. Pavaizdavimas subtipais.

1.2. OBJEKTŲ-SAVYBIŲ (OP) MODELIS

Tradicinis duomenų bazių projektavimas apibrėžiamas, kaip procesas, kurio metu yra analizuojami vartotojų reikalavimai, aprašomos duomenų savybės ir reikalavimams relevantinė informacija atvaizduojama DBVS palaikomomis duomenų struktūromis [1]. Šis procesas suskaidomas į keturius etapus: reikalavimų analizės fazę, konceptualaus, loginio ir fizinio projektavimo fazes. Konceptualaus projektavimo fazėje modeliuojama vartotojų informacija bei jos apdorojimas. Šioje fazėje naudojami trys pagrindiniai semantiniai modeliai – objektinis, EER- ir reliacinis duomenų modeliai. Šie modeliai yra neutralūs, neorietuoti į konkretų DBVS palaikomą modelį. Reikalavimų analizės fazėje giliai analizuojama organizacijos veikla ir rezultate tiksliai aprašomos atskirų vartotojų grupių funkcijos. Tačiau duomenų struktūros paprastai lieka netiksliai apibrėžtos, neformalizuotos. Konceptualaus projektavimo fazėje formalizuojami semantiniai sąryšiai tarp taikomosios srities sąvokų, panaudojant tam tikrą vieną ar net kelis semantinius duomenų modelius. Pastaruoju atveju integruojant atskirų vartotojų grupių informacijos reikalavimus konceptualiniame lygmenyje skirtingus duomenų semantinius modelius tenka transformuoti, kad specifikuoti duomenų bedrąsias savybes globalinėje schemoje. Loginio projektavimo fazėje sudaroma DB loginė shema, orientuota į pasiriktos DBVS duomenų modelį, kuris gali skirtis nuo duomenų modelio, panaudoto sudarant globalinę schemą. Čia taip reikalingos modelio transformacijos, ypač tuo atveju, kai norima loginę schemą suprojektuoti automatizuotu būdu. Savo ruožtu, kuriant sofistines, plačios paskirties DBVS stengimasi suprogramuoti unifikuotus duomenų manipuliavimo modulius, orientuotus į tipinių plataus spektro semantinių duomenų sąryšių apdorojimą. Tokie sąryšiai dar vadinami duomenų abstrakcijomis. Fizinio projektavimo metu DBVS palaikomo duomenų modelio loginė schema papildoma konkrečios kompiuterinės aplinkos ir operacinės sistemos duomenų fiziniais parametrais. Šitokia nusekli projektavimo fazių seka būdinga taip vadinamai duomenų tiesioginei inžinerijai.
Konceptualaus projektavimo fazėje, kai aprašomi įvairių vartotojų informacijos reikalavimai fiksuojami semantiniai sąryšiai tarp probleminių sąvokų, aptinkamos “siauros”, nesuderitos arba, atvirkščiai, “persotintos”, plačios sąvokos. Šiuo atveju poreikių integracijos etape tenka įvesti naujas sąvokas (dalykinės srities konceptus), kad panaikinti sąvokų nesuderinamumą ir užpildyti pastebėtas semantines spragas. Tokie procesai yra “humanizuoti”, čia reikalingi ekspertai, gerai išmanantys dalykinę sritį, kad duomemų modelius būtų galima semantiškai praturtinti. Analogiška situacija pastebima, sprendžiant duomenų atvirkštinės inžinerijos uždavinius [2], kai projektuojant konceptualaus lygio globalinę schemą panaudojamos palikuoninės veikiančios DB ir jų schemos bei įvertinami nauji informacijos reikalavimai. Šiuo atveju reikalavimų integracijos procese fiksuojant semantinius sąryšius tarp konceptų gali atsirasti taip vadinamos semantinės spragos, kurios užpildomos įvedant naujus adjekvačius konceptus. Šį procesą vadinsime schemos semantinio praturtinimo procesu. Šiame staipsnyje išnagrinėti alternatyvinių sąryšių ir alternatyvinių atributų panaudojimo EER- schemose atvejai, jų trūkumai ir galimybės juos eliminuoti, panaudojant nesudėtingas EER- modelio transformacijas. EER- diagramos naudojamas kaip reliacinių duomenų bazių modelio kvazistandartas, ir jų pagalba specifikuojami duomenų struktūriniai apribojimai. Paprastai alternatyviniai EER- schemos komponentai užduodami dviejų tipų kardinalumais 0-1 ir 0-N. Straipsnyje išnagrinėti trys tipiniai kardinalumo apribojimais išreikštų alternatyvinių sąryšių ir atributų transformavimo atvejai. Šios trnsformacijos atliekamos EER schemų atžvilgiu tiesioginės ir atvirkštinės duomenų inžinerijos kryptimis. Transformacijos iliustruojamos konkrečiais pavyzdžiais. Tiesioginės inžinerijos atveju struktūriniai EER-apribojomai transformuojami į reliacinius apribojimus, o atvirkštinės inžinerijos atveju EER- apribojimai transformuojami į koncepcinio OBJEKTŲ-SĄVYBIŲ modelio konstrukcijas [3], semantinės išraiškos galimybių požiūriu būdingas abstraktiems duomenų tipams, kurių aprašymui gali būti panaudojama SQL3 kalba [4].

1.2.1. Semantinių sąryšių klasifikacija ir duomenų abstrakcijos

Vienas iš pagrindinių tikslų projektuojant DBVS yra “padengti” vartotojų, naudojančių duomenų bazes, uždavinių semantiką. Projektuojamos plačios paskirties DBVS orientuojamos į tam tikro duomenų modelio panudojimą. Objektiniuose ir EER duomenų modeliuose naudojamos bendrosios duomenų abstrakcijos yra tipo/supertipo (specializavimo/apibendrinimo), agregavimo ir asociatyviniai sąryšiai. Asociatyviniai sąryšiai duomenų bazių koncepcinio projektvimo stadijoje yra materializuojami arba, kitais žodžiais tariant, paverčiami agregatyvinių sąryšių tipais. Tarp dalykinės srities konceptų užduoti tipo/supertipo sąryšiai dar vadinami is_a sąryšiais. Agregatyvinius ir is_a sąryšius, specifikuotus duomenų bazių koncepcinėse schemose, vadinsime pagrindiniais struktūriniais apribojimais. Pav. 1 pateikta jungtinė semantinių sąryšių [5,6] taksonomija. Šios klasifikacijos sąryšiai naudojami lingvistikoje, logikoje ir kognityvinėje psichologijoje. Išsami šių semantinių sąryšių analizė pateikta [5]. Specifikuojant semantinius sąryšius panaudosime apibendrintas objektinės orientacijos duomenų abstrakcijas [3], būdingas abstraktiems duomenų tipams [4].

Semantiniai sąryšiai

Atvirkštinėms transformacijoms iliustruoti panaudosime OBJEKTŲ-SAVYBIŲ modelio [3] kostruktus (pav. 2). Jais apibrėšime kriterijus, kuriais naudojantis išskiriamos neformaliu būdu objektai. Sakykime, kad turime esybę O su jos vardu, paimtu iš dalykinės srities vardų universumo D. Esybė O yra koncepcinės schemos objektas ( objektų klasė), jei jis charakterizuojamas penkiomis toliau aprašytomis savybėmis.
(1) Objektas O (žr. pav. 2a) turi vieną ar kelis atributus iš aibės aset(O); kiekvienas atributas A, A aset(O), turi unikalų vardą iš universumo D. Objektas O turi objektų egzempliorių o aibę vset(O), o vset(O). Kiekvienas egzempliorius asocijuojamas tiksliai su viena kiekvieno atributo A reikšme V. Atributo A galimų reikšmių aibę žymėsime vset(A). Reikšmė V vset(A) turi vardą iš aibės D. Kiekvienas atributas A yra objekto savybė, ir atributo A reikšmė V yra egzemplioriaus o savybė. Objekto O savybių aibę žymėsime pset(O), ir Aaset(O) pset(O). Be to, kiekvienam objektui O egzistuoja aibėje vset(O) apibrėžta funkcija a:
a: vset(O)  vset(A); Apset(O).
Grafinėje notacijoje aibės vset(O), aset(O), pset(O) ir vset(A) paprastumui nežymimos (žr.
pav. 2a’). Kadangi atributas A, priklausydamas aibei aset(O), tuo pačiu priklauso ir aibei
pset(O), tai koncepcinės schemos aibėje pset(O) šis atributas gali būti irgi nenurodytas
(žr.pav. 2a’). Arba atvirkščiai, jeigu koks nors atributas yra parodytas aibėje pset(O), tai jis gal
paprastumui neparodomas aibėje aset(O). Paprastai aibė aset(O) arba jos poaibiai
specifikuojami objekto O schemoje, jeigu ta aibė arba jos poaibiai jungiami į išorines (pvz.
poaibio) priklausomybes su kito objekto atributų aibe ar jos poaibiais. Jeigu objekto O
atributų aibė aset(O) arba jos poaibiai jokių išorinių priklausomybių neturi, tai ši aibė arba
jos poaibiai aplamai nespecifikuojami.
(2) Objektas O turi vidinį sąryšį R (2b pav.) su unikaliu vardu iš universumo D. Vidinį sąryšį sudaro pozicijonuota atributų Ai , i=1,2,…,n; Aiaset(O), aibė (sąrašas) . Jeigu vidinis sąryšis R yra identifikacinis (raktinis), tai toks sąryšis grafinėje notacijoje braižomas iš kairės objekto O atžvilgiu, o pozicijonuoti atributai Ai žymimi nukreipti į viršų (žr. 2c pav.). Jeigu sąryšiu R apimtų atributų aibė aset(R) padengia visą objekto O atributų aibę aset(O), t.y. aset(R)=aset(O), tai toks vidinis sąryšis būtinai bus identifikacinis. Čia reikia pažymėti, kad identifikacinių sąryšių gali būti keli, ir identifikacinį sąryšį gali sudaryti vienas ar keli atributai iš aset(O), t.y. nebūtinai visi aibės aset(O) atributai. Vidinis sąryšis R ir juo apimti atributai yra objekto O savybės, t.y. Rpset(O), aset(R)pset(O). Kiekvienas objektas- ezempliorius iš aibės vset(O) turi vieną savybės R reikšmę V=, kuri yra to objekto- egzemplioriaus savybė. Kiekvienas sąrašo komponentas Vi yra atatinkamo atributo Ai reikšmė ir turi savo vardą. Čia egzistuoja tokios funkcijos r ir ai , kurios yra apibrėžtos objekto O egzempliorių aibėje vset(O) ir sąryšio R egzempliorių aibėje vset(R):
r : vset(O)  vset(R);
ai : vset(R)  vset(Ai); i=1,2,…,n
Jeigu sąryšis R yra identifikacinis, tai tada, be to, egzistuoja bijektyvioji funkcija ^r :
^r : vset(R)  vset(O),
apibrėžta egzempliorių aibėje vset(R).
Jeigu koks nors atributas Aj yra įtrauktas į bent vieną vidinį sąryšį, tai jis traktuojamas, kaip
sujungtasis atributas, ir aibėje pset(O) gali būti nespecifikuotas. Atributas, kuris nepatenka į
jokį vidinį sąryšį, vadinsime laisvuoju (nesungtuoju) atributu. Visi specifikuoti vidiniai sąryšiai
paprastumui taip pat aibėje pset(O) gali būti nenurodomi.

(3) Objektas O turi vidinę funkcinę priklausomybę, kuri vieną sąryšių egzemplių aibę atvaizduoja kitoje sąryšių egzempliorių aibėje. Paimkime du objektus R’ ir S’ su jų atitinkamais vidiniais sąryšiais R ir S (2d pav.). Juos ateityje žymėsime R’.R ir S’.S . Sakykime, kad teisinga yra išorinė funkcinė priklausomybė s :
s : R’.vset(R)  S’.vset(S),
kurioje R’.vset(R) yra objekto R’ vidinio sąryšio egzempliorių aibė, ir ši aibė sudaro funkcijos s
apibrėžimo sritį, o S’.vset(S) – šios funkcijos reikšmių sritį.
Tikslu tokią užduotą išorinę priklausomybę paversti vidine priklausomybe sudaromas naujas
objektas O, kurio savybėmis bus vidiniai sąryšiai R ir S bei šiais sąryšiais apimti atributai
A1,A2,…,An ir B1,B2,…,Bm (2d pav.). Į objektą O įkelta funkcinė priklausomybė suvokiama
pagal nutylėjimą ir aiškiame pavidale nenurodoma.

(4) Objektas O turi elgsenos metodą M su unikaliu vardu objekto O metodų aibėje mset(O) (2e pav.). Koncepcinėje schemoje metodas s[pecifikuojamas signatūros formoje. Metodo M signatūra yra funkcija m , kurios apibrėžimo sritį sudaro objekto vidinio sąryšio sąryšio R egzempliorių aibė, o reikšmių sritį sudaro vidinio sąryšio R’ egzempliorių aibė:
m: vset(R)  vset(R’)
Sąryšio R= atributai Ai, i=1,2,…,n sudaro metodo M įėjimo atributus, o
sąryšio R’= atributai Bj, j=1,2,…,m sudaro metodo išėjimo atributus. Atributai
Ai, Bj, vidiniai sąryšiai R ir R’ bei pats metodas M yra objekto O savybės.

(5) Objektas O gali būti kito objekto Q savybė :
• objekto Q atributas;
• objekto Q atributo reikšmė;
• objekto Q vidinis sąryšis;
• objekto Q metodo signatūra.
Pav. 3 pateiktas trijų objektų PADALINYS, FINANSŲ_SKYRIUS ir TARNAUTOJAS pavyzdys. Tarp tų objektų ir jų komponentų parodytos išorinės poaibio ir aibės elemento priklausomybės. Objektų klasės PADALINYS vienas objektas- egzempliorius yra FINANSŲ_SKYRIUS. Objektas PADALINYS turi vieną savybę VADOVAS, o objektas FINANSŲ_SKYRIUS be savybės VADOVAS dar turi savybę SUDĖTIS, kuri yra daugiareikšmė, kadangi objekto FINANSŲ_SKYRIUS atributo SUDĖTIS reikšmė FINANSISTAS yra poaibis atžvilgiu aibės TARNAUTOJAS. Atributas FINANSŲ_SKYRIUS.VADOVAS yra vienareikšmis atributas. Šio atributo reikšmės vardas koncepcinėje schemoje neparodytas, tačiau ši reikšmė visada yra aibės PADALINYS.vset(VADOVAS) elementas.

Pav. 2a. Objektas O turi atributą A iš aibės aset(O); kiekvienas klasės O objektas- egzempliorius turi tiksliai vieną atributo A reikšmę V iš reikšmių aibės vset(A); kiekvienas atributas iš aibės aset(O) yra objekto O savybė, t.y. aset(O) pset(O).

Pav. 2b. Objekto O pozicijonuota atributų Ai, i=1,2,…,n seka sudaro vidinį sąryšį R; sąryšiu R apimtų atributų aibė aset(R) kartu su sąryšiu R sudaro objekto O savybių aibę pset(O); objektas- ezempliorius turi vieną savybės R reikšmę V=, kuri yra objekto- egzemplioriaus savybė.

Pav. 2c. Objektas O turi vidinį identifikacinį sąryšį R; šiuo sąryšiu apimtų atributų aibė aset(R) kartu su tuo sąryšiu R sudaro objekto O savybių aibę pset(O); sąryšio reikšmė V yra objekto egzemplioriaus savybė.

Pav. 2d’. Užduota išorinė funkcinė priklausomybė s
(2d pav.) perkelta į naujai sudarytą objektą O; vidiniai sąryšiai O.R ir O.S kartu su jais apimtais atributais sudaro naujo objekto O savybių aibę pset(O).

Pav.2e. Objektas O turi elgsenos metodą M, kurio įėjimo atributai Ai ; i=1,2,…,n; sugrupuoti objekto O vidiniame sąryšyje R, o išėjimo atributai Bj ; j=1,2,…,m; sugrupuoti objekto O vidiniame sąryšyje R’. Metodas M, vidiniai sąryšiai R ir R’ bei šių sąryšių atributai yra objekto O savybės.

1.2.3. Keturi objektinės orientacijos kalbų principai

4.2 pav. parodytas koncepcinės schemos pavyzdys su trimis objektų tipais STAČIAKAMPIS, KVADRATAS ir TAŠKAS.
Charakterizuojant objektų klasę STKAMP nurodyti trys jos vidiniai sąryšiai:
– stačiakampio identifikatorius STKAMP.ID_STKAMP,
– stačiakampio viršutinis kampas STKAMP.V_KAMPAS,
– stačiakampio apatinis kampas STKAMP.A_KAMPAS
Objektų klasės STKAMP vidiniai sąryšiai su objektų klase TAŠKAS
sujungti isa-priklausomybe:
STKAMP.V_KAMPASisaTAŠKAS;
STKAMP.A_KAMPASisaTAŠKAS.
Klasės STKAMP egzemplioriai identifikuojami sąryšiu ID_STKAMP. Objektų klasės TAŠKAS identifikatorius yra ID_TAŠKAS, kuris sudarytas agreguojant dvi koordinates X integer ir Y integer. Stačiakampio elgsena charakterizuojama funkcijomis:
– y1n(), kuri padidina viršutinio kampo Y1-koordinatę;
– plotis() ir ilgis(), kurios nustato stačiakampio savybes PLOTIS ir ILGIS;
– plotas(), kuri nustato stačiakampio savybę PLOTAS.
Objektų klasė KVADRATAS apibrėžiama kaip specialus klasės STKAMP atvejis, kai šiai klasei užduotas apribojimas funkcijos lygu(ILGIS,PLOTIS)=TRUE pavidale. Dėka šio apribojimo schemoje egzistuoja išorinis sąryšis KVADRATASisaSTKAMP.

4.2 pav. Koncepcinės schemos pavyzdys

Objektinės orientacijos kalboje naudojami tokie keturi principai:
1) objektų pakeičiamumas (substitutability),
2) statinė tipų kontrolė (static type checking),
3) mutabilumas (mutability),
4) specializavimas per apribojimus (specialization vie constrains).
Charakterizuosime šiuos keturis principus:
1. Jeigu QisaO, tai kokiame nors programos vykdymo kontekste, kuriame aktualizuojamas objektas-egzempliorius iš O, tai šiame kontekste aktualizuojamas egzempliorius iš Q.
2. Statinėje tipų kontrolėje informacija apie tipų suderinamumą kontroliuojama programos kompiliavimo metu. Todėl šios kontrolės nereikia atlikti programos vykdymo metu. Dėl to supaprastėja programa ir apsidraudžiame, kad nebus klaidų, susijusių su tipų deklaravimu.
3. Operacija m yra tipo Q mutatorius, jeigu objektui-egzemplioriui qQ vykdant operacijos g programinį fragmentą savybės P reikšmė p1 pakeičiama á naują reikšmę p2: p1=g(q); m(q); p2=g(q); p1¹p2. Jeigu m yra tipo Q mutatorius, tai jis turi galimybę stebėti egzemplioriaus qQ elgseną. Objektų sistemoje naudojamas mutabilumo principas, jeigu objektų sistemoje sukuriamas tipas Q su mutavimo operacija.
4. Sąryšis QisaO gali būti specifikuotas, nurodant papildomus apribojimus atžvilgiu Q. Jeigu qQ, tai q turi tuo apribojimus patenkinti.
Iliustruosime šių principų pritaikymą 2pav. pavyzdžiui. Stačiakampio subtipas yra kvadratas. Jis definuojamas taip kaip STKAMP, išskyrus tai, kad visos keturios kraštinės yra lygios, t.y. ILGIS=PLOTIS. Funkcija y1n padidina stačiakampio koordinatę Y1 dydžiu a. Ši funkcija definuota tipui STKAMP. Ją aktualizavus egzempliorius stkamp yra modifikuojamas. Kas atsitiks, kai kvadrato egzempliorių persiunčiame šiai funkcijai? Ši funkcija nežino, kad kvadratas turi savybę Y2-Y1=X2-X1. Kitais žodžiais tariant, jei sistemoje realizuojami pirmieji du principai (mutabilumas ir pakeičiamumas), kvadratas gali būti persiųstas programos vykdymo metu funkcijai y1n ir tokiu būdu po modifikavimo pažeisti apribojimai, užduoti tipui KVADRATAS. Čia galimi tokie sprendimo būdai:
1. OOK nepalaiko mutabilumą ir, tokiu būdu, funkcijos, kurios modifikuoja egzempliorius, pavyzdžiui y1n, negali būti definuojamos.
2. Eliminuojamas pakeičiamumas ir problema dingsta, kadangi kvadratas-egzempliorius nepersiunČiamas funkcijoms, apibrėžtoms tipui STKAMP.
3. Nevykdoma statinė tipų kontrolė ir tada, vykdant funkciją y1n, bus fiksuojama programos vykdymo klaida, kai pažeidžiami apribojimai kvadratams-egzemplioriams.
4. OOK nepalaiko subtipus, apibrėžiamus kaip apribotų supertipų variantus.

Klasių elgsenos standartinės funkcijos

Abstraktūs duomenų tipai (ADT) praplečia reliacinio skaičiavimo kalbą (SQL’92) ir ADT standartizuotoje kalboje SQL3 inkapsuliuoja tipų vidinę struktūrą. ADT susideda iš heterogeninės atributų sekos. Kai ADT yra deklaruojamas, automatiškai yra užduodamos trijų tipų funkcijos:
– stebėjimo funkcijos (observer functions),
– mutavimo funkcijos (mutators),
– ADT egzempliorių konstravimo funkcijos (constructor functions).
Deklaruosime 2.2 pav. pateikto pavyzdžio klasės STKAMP struktūrą.

CREATE TYPE stkamp
(spalva varchar(220),
id_stkamp id_stkamp)
CREATE TYPE id_stkamp
(v_kampas v_kampas,
a_kampas a_kampas)
CREATE TYPE v_kampas
(x1 integer,
y1 integer)
CREATE TYPE a_kampas
(x2 integer,
y2 integer)

Šis tipų definicijos automatiškai užduoda:
– konstruojančias funkcijas

stkamp()  stkamp
id_stkamp()  id_stkamp
v_kampas()  v_kampas
a_kampas()  a_kampas

– stebėjimo funkcijas

spalva(stkamp)  varchar(20)
id_stkamp(stkamp)  id_stkamp
v_kampas(id_stkamp)  v_kampas
a_kampas(id_stkamp)  a_kampas
x1(v_kampas)  integer
y1(v_kampas)  integer
x2(a_kampas)  integer
y2(a_kampas)  integer

– mutatorius

spalva(stkamp, varchar(20))  stkamp
id_stkamp(stkamp, id_stkamp)  stkamp
v_kampas(id_stkamp, v_kampas)  id_stkamp
a_kampas(id_stkamp, a_kampas)  id_stkamp
x1(v_kampas, integer)  v_kampas
y1(v_kampas, integer)  v_kampas
x2(a_kampas, integer)  a_kampas
y2(a_kampas, integer)  a_kampas

Deklaravus ADT paskelbiami tipų ir atributų kintamieji, kad būtų galima užduoti įvairias funkcijas tipų atžvilgiu. Toliau pateiktas programos fragmentas, kuriame du priskyrimo operatoriai yra tarpusavyje ekvivalentiški:

BEGIN
DECLARE st stkamp;
DECLARE sp varchar(20);
SET sp=st..spalva;
SET sp=spalva(st);
END;

ADT egzempliorių konstravimas išbaigiamas panaudojus konstravimo funkcijas, kurios yra palaikomos kaip ADT definicijos dalis. Kai konstravimo funkcija yra suaktyvinta, tada:
– generuojamas naujas ADT egzempliorius,
– priskiriama egzemplioriui tipo žymė,
-kiekvienam naujo egzemplioriaus atributui priskiriama nulinė
(null) reikšmė.

Pavyzdžiui:

BEGIN
DECLARE st stkamp;
DECLARE sp varchar(20);
SET st=stkamp();
SET st..spalva=‘RAUDONA’;
SET st..id_stkamp=id_stkamp();
SET st..id_stkamp..v_kampas=v_kampas();
SET st..id_stkamp..v_kampas..Y1=10;
END;

Pirmaisiais dviem deklaravimo sakiniais tipų stkamp ir varchar kintamiesiems st ir sp priskiriamos nulinės reikšmės. Čia reikia pastebėti, kad tipo kintamojo nulinė reikšmė nėra tas pats, kas tipo egzemplioriaus visų atributų nulinės reikšmės. Priskyrimo operatoriumi SET st=stkamp() sudaromas naujas stačiakampio egzempliorius ir priskiriamas kintamajam st. Šiuo atveju kintamasis st turi nenulinę stačiakampio egzempliorių, kurio visi atributai yra nuliniai. Priskyrimo operatorius SET st..spalva=‘RAUDONA’ atributaui SPALVA priskiria reikšmę RAUDONA. Operatorius SET st..id_stkamp=id_stkamp() sukuria tipo id_stkamp naują egzempliorių ir priskiria jį tipo st atributui id_stkamp. Naujas id_stkamp egzempliorius nėra nulinis egzempliorius. Šis naujas nenulinis identifikatorius turi nulinius atributus. Analogiškai sukuriamas tipo v_kampas egzempliorius. Ir pagaliau tipo v_kampas atributas Y1 po paskutinio priskyrimo įgauna reikšmę 10.
ADT gali būti apibrėžtas kaip kito ADT potipis, priskiriant jam reikiamą vardą:

CREATE TYPE kvadratas UNDER stkamp(ryškumas varchar(20));

Naujas potipis KVADRATAS paveldi tipo STKAMP struktūrą ir elgseną. Struktūros paveldas reiškia, kad potipis KVADRATAS turi visus STKAMP atributus ir dar jam deklaruotas naujas papildomas atributas RYŠKUMAS. Be to, KVADRATAS paveldi visas supertipo STKAMP operacijas, kurios charakterizuoja stačiakampio elgseną. Tokiu būdu visos tipo STKAMP operacijos gali būti taikomos tipo KVADRATAS visiems egzemplioriams. Tipo KVADRATAS deklaravimas automatiškai sukuria konstruojančią funkciją

kvadratas()  kvadratas.

Be to, visos stebėjimo ir mutavimo funkcijas, apibrėžtas tipui STKAMP paveldi subtipas KVADRATAS.
OOK palaiko tiek funkcijų perkrovimo (overloading), tiek funkcijų dinaminio persiuntimo procesus. Jeigu funkcija yra iškvieČiama, tai vykdymui pasirinktas funkcijos egzempliorius programos vykdymo metu priklauso nuo aktualizuotų argumentų tipo. Funkcijos egzempliorius parenkamas iš taikytinų tarpo toks, kuris geriausiai vykdymo metu tinka duotiems argumentų tipams.

Elgsenos aprašymo objektiškai orientuota kalba realizacijos galimybės

1.Objektų pakeičiamumo realizacija

Jis numato galimybę subtipo egzempliorių tam tikrame kontekste panaudoti kaip supertipo egzempliorių. Todėl subtipo egzempliorius gali būti:
– panaudotas vykdant funkcijas, apibrėžtas supertipui;
– saugojamas supertipo kintamuosiuose arba stulpeliuose;
– grąžinamas, kaip supertipo funkcijos formalus rezultatas.
Sakykime, kad esame deklaravę tokius toliau parodytus tipus ir funkcijas:
CREATE TYPE stkamp
(x1 integer,
y1 integer,
x2 integer,
y2 integer,
spalva varchar(20),
a integer);
CREATE TYPE kvadratas UNDER stkamp
(ryškumas varchar(20));
CREATE FUNKTION y1n(st stkamp)
RETURNS integer
RETURNS st..y1+st..a;
CREATE FUNCTION plotis (st stkamp)
RETURNS integer
RETURNS st..x2-st..x1;

Panagrinėkime toká programos fragmentą:

BEGIN
DECLARE st stkamp;
kv kvadratas;
pl integer;
SET kv=kvadratas (3,9,6,6,’RAUDONAS’,’BOLD’);
SET pl=plotis(kv);
END;

Pirmasis priskyrimo operatorius sukonstruoja kvadrato egzempliorių ir priskiria jį kintamajam kv. Antrasis priskyrimo operatorius inicijuoja kvadrato egzemplioriui funkciją plotis, kuri buvo deklaruota tipui stkamp. Šis pavyzdys iliustruoja objektų pakeičiamumo principą, kai pateikto fragmento kontekste kvadrato egzempliorius traktuojamas kaip stačiakampis. Sukurtas kvadrato egzempliorius gali būti priskirtas tipui stkamp tokiu operatoriumi SET st=kv. Šis operatorius bus korektiškas taip pat dėka objektų pakeiČiamumo principo.

2.ADT mutabilumo realizacija

Mutabilumo svarbą iliustruosime tipų STKAMP, ID_STKAMP ir V_KAMPAS pavyzdžiais, deklaruotais anksčiau. Jeigu šie tipai yra mutabilūs, tada galima pasinaudoti sistemos palaikomomis mutavimo funkcijomis

spalva(stkamp, n_spalva)
ir
x1(v_kampas(id_stkamp(stkamp)), n_x1),

kurias galima užrašyti tokiame pavidale:

stkamp..spalva=n_spalva
ir
stkamp..id_stkamp..v_kampas..x1=n_x1.

Jei ADT būtų nemutabilūs, tai tada mes turėtume pirmiausiai sukurti egzempliorių v_kampas, susidedantį iš atributo x1 naujos reikšmės ir y1 senų reikšmių. Po to, reiktų sukurti naują id_stkamp egzempliorių su nauja atributo v_kampas reikšme ir sena a_kampas reikšme ir pagaliau sukurti naują stkamp egzempliorių su nauja id_stkamp reikšme ir senąja spalvos reikšme. Atributo x1 modifikavimą būtų galima užduoti taip:

SET stkamp=id_stkamp(stkamp, v_kampas(id_stkamp(stkamp),
x1(v_kampas(id_stkamp(stkamp)), n_x1))).

Jeigu funkcijos yra mutuojančios, tai modifikuojamam objektui-egzemplioriui senos atributų reikšmės kopijuojamos automatiškai.
Čia matome, kad mutabilių ADT atveju operacijos yra paprastesnės. Dabar panagrinėkime kitą pavyzdį. Paimkime vėl tipus STKAMP ir KVADRATAS. Sakykime, kad funkcija y1n padidina kvadrato koordinatę Y1 dydžiu a:

SET stkamp=y1n(stkamp).

Jeigu tipai nebūtų mutabilūs, tai funkcija y1n reikalautų sukurti naują stkamp egzempliorių su nauja Y1 reikšme, kopijuojant visas kitas atributų reikšmes. Kas atsitiks, jeigu šią funkciją panaudosime kvadratui? Analogiškas operatorius

SET kvadratas=y1n(kvadratas)

duos tipo klaidą, kadangi funkcijos y1n rezultato tipas yra stkamp, o ne kvadratas. Kad funkcijos y1n rezultatas būtų teisingas, reikia, kad ši funkcija būtų apibrėžta tipui KVADRATAS ir grąžintų kvadrato egzempliorių. Kitais žodžiais tariant dingtų objektų pakeičiamumas. Mes reikalaujame, kad supertipų funkcijos būtų perkraunamos tam, kad išvengti tipų klaidų. Tokiu būdu OOK turi palaikyti mutabilumą norint išsaugoti objektų pakeiČiamumą, nereikalaujant perkrauti supertipų funkcijas modifikuojant subtipų egzempliorius.

3.Ar galima panaudoti apribojimais užduotą specializaciją?

Funkcijos y1n parametrai yra stkamp ir sveikaskaitinė reikšmė. Ši funkcija sumažina stačiakampio šonines kraštines dydžiu a. Jeigu OOK naudojamas objektų pakeičiamumo principas, tai kvadrato egzempliorius gali būti programos vykdymo metu persiųstas funkcijai y1n, tačiau tuo metu mes pažeidžiame apribojimą, kad kvadrato ilgis turi būti lygus pločiui, ir stačiakampis nebebus kvadratas.
Norint taikyti apribojimais sąlygotą specializaciją galimi tokie keliai, kurie visi yra nepriimtini.
1. Nevykdyti statinę tipų kontrolę, kadangi mutuojančios funkcijos, kurios modifikuoja atributų reikšmes, gali iššaukti išimtis, kai subtipai programos vykdymo metu yra persiunČiami kaip argumentai. Tačiau tai pažeistų OOK pagrindines tradicijas. Be to, papildžius DB naujais subtipais ir nevykdant statinės kontrolės gali tekti nutraukti taikomųjų uždavinių vykdymą.
2. Eliminuoti objektų pakeičiamumą ir nevykdyti funkcijų subtipams, kai tos funkcijos apibrėžtos supertipams.
3. Nepalaikyti mutabilumo, t.y. nevykdyti ADT egzempliorių būsenos modifikavimo operacijos, nesukuriant naujų tipų egzempliorių. Be to, kaip jau buvo parodyta anksčiau, mutabilumas yra būtina sąlyga, kad užtikrinti objektų pakeiČiamumą ir paveldimumą. Todėl mutabilumas negali būti eliminuotas nepanaikinant OOK palaikomą pakeiČiamumą.
4. Reikalauti supertipams apibrėžtų visų funkcijų perkrovimo, t.y. pakeisti dabartinį SQL3 tipų specializavimo modelį. Tai nebūtų priimtina dėl tos priežasties, nes SQL3 vartotojams reiktų tipų hierarchijas apibrėžti patiems vietoj to, kad pirkti jas kaip klasių bibliotekas, kurias tiražuoja trečiosios šalys. Koncepcinių schemų procedūrinėje realizacijoje šį uždavinį būtų galima supaprastinti, numaČius vartotojams galimybę definuoti ne visas tipų hierarchijas, o tik tuos subtipus su leistina elgsena, kuriuos galima apibrėžti kombinuojant tiražuojamų tipų hierarchijų funkcionalumą. Dabar gi pareikalavus, kad sistemoje visos funkcijos būtų perkraunamos, vartotojai turėtų iš naujo apibrėžti (redefine) visas funkcijas, tiekiamas klasių bibliotekose, kai tie vartotojai nori kombinuoti supertipų funkcionalumą definuojamiems subtipams. Dabartinės SQL3 subtipų ir paveldo modelis nereikalauja pakartotinų definicijų, kai subtipams naudojamos supertipų funkcijos. Bet tada supertipų funkcijos (pavyzdžiui, y1n) užduoda neleistiną subtipų (pavyzdžiui, KVADRATAS) elgseną. Gal tada visiškai atsisakyti apribojimais užduodamų isa-sąryšių? Bet tada liks nerealizuota didelė dalis apribojimų, specifikuojamų koncepcinėmis schemomis

Atsisiųsti 1SKW2000