Objektum relációs adatmodell
Objektum orientált adatmodellek RDBMS OOP OOPPD ORDBMS OODBMS SDM Heterogén megközelítés : mit jelent az OODB ?
Third Generation Database System Manifesto (~1990) Őrizze meg a (relációs) DBMS funkcionalitását Támogassa az OO alapelveit Nyílt rendszert alkosson ADT kezelése : összetett gyári típusok : saját típusok : metódusok létezése ADT egyedisége : belső objektum azonosító + látható kulcs ADT öröklési kapcsolat : Specializált típusok NULL, VIEW, integritási feltételek, halmaz megközelítés, ad-hoc query, függetlenségi szintek
OBST rendszer C++-ban megírt objektum tároló modulok alkalmazása nincs DBMS
ODL-OQL modell ODMG szabvány objektumtípusok sémaszerű megadása class onév { attributumok … metódusok kapcsolatok integritási felt. } reláció ( attributumok … integritási felt. ) attribute … relationship …
ODL adattípusok ODL kapcsolatok atomi típusok struktúra halmaz multihalmaz tömb lista relationship céltípus knev [ inverse knev2 ] ODL metótusok mnev (paraméterlista) raises (kivétel); ODL integritási felt. key (attributumlista)
Öröklés class interface literal interface onév : ős-i{ … } struct onév : ős-o { … } class onév EXTENDS ős – o : ős-i (extent enev) { … } extent : osztály objektumainak halmaza
típusok megadása Atomi típusok: integer, float, character, string, boolean - Komplex típusok: Set(...) Bag(...) List(...) Array(...) Struct(...) bag(2,1,2) struct(foo:bag(2,1,2), bar: „dog") set(struct(title:"My Fair Lady",year:1965), struct(title:"ET",year:1985), struct(title:"Jaws",year:1981) )
CLASS Movie : Product { extent Movies; key (title,year); attribute string title; attribute integer year; attribute integer length; attribute enumeration(color,blackAndWhite) filmType; relationship Set stars inverse Star::starredIn; relationship Studio ownedBy inverse Studio::owns; float lengthInHours() raises (noLengthFound); starNames(out Set); otherMovies(in Star, out Set) raises(noSuchStar); };
interface Course { keys name,number; attribute string name; attribute string number; relationship List<Section> has_sections inverse Section::is_section_of; relationship Set<Course> has_prerequisites inverse Course::is_prerequisite_for; relationship Set<Course> is_prerequisite_for inverse Course::has_prerequisites; offer(in Semester) raises(already_offered); drop(in Semester) raises(not_offered); }
OQL: Az alap SQL nyelvre épül SELECT .. FROM .. WHERE .. GROUP BY .. HAVING .. ORDER Útvonal kifejezés: m1.m2.m3… m1m2 m3 elemei tagokon vezet keresztül azonosító név: név : kifejezés Az útvonalnak egyértelműnek kell lennie Többértékű elemnél külön változóhoz rendeljük (…expr… ) AS| |IN iterator_változó kvantorok: for all x in S: C(x) exists x in S: C(x) aggregátorok: avg( select-kif.) max(), min(), sum(), count()
select m.year from Movies m where m.title = "Gone With the Wind" Melyik évben készült a "Gone With the Wind„ film? select m.year from Movies m where m.title = "Gone With the Wind" A Casablance film szereplőinek neve? select s.name from Movies m, m.stars s where m.title = "Casablanca" A Disney filmekben szereplők nevei? select distinct s.name from Movies m, m.stars s where m.ownedBy.name = "Disney" Az azonos helyen lakó sztárok párjai? select distinct Struct(star1: s1, star2: s2) from Stars s1, Stars s2 where s1.addr = s2.addr and s1.name < s2.name
from (select m from Movies m where m.ownedBy.name = "Disney") d, A Disney filmekben szereplők nevei rendezve? select distinct s.name from (select m from Movies m where m.ownedBy.name = "Disney") d, d.stars s order by s.name A Disney filmekben szereplők rendezve? select s from Stars s where exists m in s.starredIn : m.ownedBy.name = "Disney" A filmek átlagos hossza? avg(select m.length from Movies m)
select std, yr, sumLength: sum(select q.m.length from partition q) from Movies m group by std:m.studio, yr:m.year select std, yr, sumLength: sum(select q.m.length from partition q) from Movies m group by std:m.studio, yr:m.year having max(select q.m.length from partition q) > 120
where s.name = "Harrison Ford") except from Movies m (select distinct m from Movies m, m.stars s where s.name = "Harrison Ford") except from Movies m where m.ownedBy.name = "Disney") SELECT DISTINCT STRUCT (kod : x.azonosito, jegyek: (SELECT y.jegyek FROM x.targyak AS y WHERE y.ev = 2004)) FROM hallgatok AS x SELECT AVG(SELECT t.jegy FROM h.targyak AS t) FROM hallgatok AS h WHERE h.evfolyam = 4
Relációs és ODL/OQL modell összehasonlítása 1. minta feladat: leckekönyv ábrázolása engedélyek hallgató szak beiratkozás félév tanszék index bejegyzés tárgy oktató
relációs modellbeli megvalósítás OKTATO(okod, nev, szido, lakcim, tanszek, beosztas) TANSZEK(tkod, nev, cím, tvezeto, terulet) HALLGATO(hkod, nev, szido, lakcim, status) ENGEDELY(hallgato, datum, leiras, tipus) SZAK(szkod, nev, leiras) FELEV(fkod, ev, szak, leiras) TARGY(tkod, nev, oktato, tanszék, leiras, lezaras) BEIRATKOZAS(bkod, hallgato, felev,atlag, lezaras) INDEXB (bkod, beiratkozas, targy,tipus) BEIRAS(indexb, datum, tipus, érték, oktato)
ODL megvalósítás nagyobb tervezési munka, az összetett szerkezetek és azok viszonyát is fel kell fedezni class szemely { struct lcim {string varos, string utca,..} attribute string nev; attribute date szido; attribute lcim lakcim; } class oktato extends szemely (extent oktatok) { attribute string beosztas; relationship tanszek egyseg inverse tanszek::oktatok; void indit (in targy t) raises (no_targy); csak a beépített kapcsolatok működnek hatékonyan
Minta lekérdezés tanszékenkénti átlagjegy az X szak hallgatóinál Y évben relációs algebra: SELECT AVG(b.ertek), k.nev FROM beiras b, indexb i, targy t, tanszek k, beiratkozas s, felev f, szak z WHERE f.ev = Y AND z.nev = X AND b.indexb = i.bkod AND i.targy = t.tkod AND t.tanszek = k.tkod AND i.beiratkozas = b.bkod AND b.felev = f.fkod AND f.szak = z.szkod GROUP BY k.nev nehézség: a kapcsolódó adatelemek illesztése lassú végrehajtás
OQL megvalósítás: SELECT atl: AVG(SELECT b.ertek FROM i.beiras b), tsz: i.targy.tanszek FROM indexb i WHERE i.beiratkozas.felev.szak.nev= X AND i.beiratkozas.felev.ev= Y Sok esetben egyszerűbb a kapcsolatok megfogalmazása gyorsabb művelet végrehajtás az implementáció bonyolultabb
SQL1999 1975: SEQUEL SQL86 SQL89 SQL92 SQL1999 (SQL3) SQL2003 (SQL4) SQL-FRAMEWORK SQL-FOUNDATION SQL-CLI SQL-PSM SQL-BINDINGS SQL-MED SQL-OLB SQL-JRT SQL-XML SQL-OLAP …
SQL1999 ORDB modell új struktúra elemek: UDT (felhasználói típusok) VALUE OBJECT komplex struktúra egységbe zárás öröklés azonosítás overloading UDT-TABLES (objektum táblák) táblák nézetek
megkülönböztető elemi típus saját adattípusok érték struktúra típus objektum Elemi UDT CREATE TYPE tnev AS gytipus FINAL; CREATE TYPE TESTMAGASSAG AS INTEGER FINAL; CREATE TYPE SZULEV AS INTEGER FINAL; CREATE TABLE DIAKOK ( … TM TESTMAGASSAG CHECK (….), SZEV SZULEV, …)
szigorú típusegyezés SELECT 2004-SZEV, TM FROM DIAKOK WHERE TM > 180 OR SZEV < 10*TM; megoldás SELECT 2004-CAST(SZEV AS INTEGER), TM FROM DIAKOK WHERE CAST(TM AS INTEGER) > 180 OR CAST(SZEV AS INTEGER) < 10*CAST(TM AS INTEGER); a DOMAIN koncepciót hivatott kiváltani
Struktúrált UDT CREATE TYPE tnev UNDER őstnev AS szerkezet [NOT] INSTANTIABLE [NOT] FINAL hivatozas-szerkezet cast-szerkezet egyszeres öröklés megengedett szerkezet megadása attributum-nev típus [speciális integritási elem] gyári rugalmasan konstruálható típus : UDT
gyári adattípusok (bővebb mint SQL92) INTEGER NUMERIC(N,M) REAL FLOAT(M) CHAR(N) VARCHAR(N) CLOB BIT(N) BLOB DATE TIME TIMESTAMP BOOLEAN ARRAY[N] ROW(…) CREATE TYPE DIAK AS ( NEV VARCHAR(30), SZDAT SZEV, TESTM TM DEFAULT 180, CÍM ROW ( VAROS CHAR(20), HSZ INTEGER ), TEL CHAR(13) ARRAY [3] ) itt nem állhat NOT NULL,.. PRIMARY KEY,.. nincs LIST,BUG,..
Hivatkozás az adatelemekre objektum.tag.tag…. de! : SQL parancsokban csak alias-néven keresztül lehet struktúra elemekre hivatkozni SELECT vevok.nev, vevok.cím.utca FROM vevok WHERE vevok.id = 34 SELECT c.nev, c.cím.utca, d.utca FROM vevok AS c, vevok.cím AS d WHERE c.id = 34 SELECT vevok.nev, vevok.cím.utca FROM vevok, vevok.cim WHERE vevok.id = 34
UDT típusú mezők kezelése CREATE TABLA dolgozo ( kod INTEGER, nyelvi NYELVISMERET ) INSERT INTO dolgozo VALUES ( 3, NEW NYELVISMERET(‘ANGOL’,3)); UPDATE dolgozo SET nyelv = NEW NYELVISMERET(‘ANGOL’,3); SET nyelv = NEW NYELVISMERET(nyelv.nyelvi,3); SET nyelv = nyelv.szint(3); SET nyelv.szint = 3; SELECT kod, CAST (nyelvi AS CHAR(20)) FROM dolgozo;
UDT táblák használata UDT típusú objektumok halmazát tárolja: UDT érték + OID (self-referencing column) a kapcsolódó táblák öröklési viszonya megegyezik az UDT-ék öröklési viszonyával, nem lehet ugrás a láncolatban CREATE TABLE táblanév UNDER tnev OF típus helyes hibás
Hivatkozás adattípusa DECLARE SECTION mm AS LOCATOR film END DECLARE SECTION lokátorok a LOB elemekhez CREATE TYPE nn AS ( mm REF (típus) ) hivatkozást tartalmazó attribútum mm->nn DEREF(mm) a hivatkozott objektum eleme a teljes hivatkozott objektum
CREATE TYPE CSAPAT_T AS ( NEV CHAR(20), LETSZAM NUMBER(3) SZEKHELY CÍM); CREATE TYPE JATEKOS_T AS ( CSAPAT REF (CSAPAT_T) ) INSTANTIABLE NOT FINAL ; CREATE TABLE CSAPATOK OF CSAPAT_T; CREATE TABLE JATEKOSOK OF CSAPAT_T; INSERT INTO CSAPATOK VALUES (‘ELORE’,23,..); SELECT J.CSAPAT->SZEKHELY FROM JATEKOSOK J … SELECT DEREF (J.CSAPAT) FROM JATEKOSOK J … még nem lehet a NEW operátort használni
Hivatkozás a procedurális elemekre eljárás függvény metódus CALL e() fv() o.m() típushoz kötött rutinok legfontosabb jellemzői - belső vagy külső - SQL vagy más nyelv - adatkezelés módja - determinisztikusság - paraméterátadás módja
Metódusok kezelése - deklaráció - definiálás CREATE TYPE otip .. ( struktúra ) METHOD mnév (par.lista) RETURNS tipus LANGUAGE SQL | C … ; CREATE METHOD mnev()…; metódusok típusai: - original - overriding - static - instance - constructor
CREATE TYPE otip .. ( struktúra ) [OVERRIDING] STATIC | INSTANCE | CONSTRUCTOR METHOD mnév (par.lista) RETURNS tipus LANGUAGE SQL | C … CREATE INSTANCE | STATIC | CONSTRUCTOR METHOD mnév(..) RETURNS tipus FOR otip BEGIN sql vagy külső RETURN … END SELECT m1.m2.mnév() FROM …
CREATE TYPE DIAK AS ( NEV VARCHAR(30), SZDAT SZEV ) METHOD KOR () RETURNS INTEGER; CREATE INSTANCE METHOD KOR() RETURNS INTEGER FOR DIAK BEGIN RETURN 2004 – CAST (SELF.SZEV AS INTEGER); END
Speciális metódusok OBSERVER: diak.nev() MUTATOR: diak.nev(”Peter”) CONSTRUCTOR: NEW diak() STATIC: típus::nev() Hivatkozás-szerkezet REF IS SYSTEM GENERATED REF USING típus REF FROM attributumok CAST-szerkezet CAST bal SOURCE AS DISTINCT jobb WITH konv CAST bal DISTINCT AS SOURCE jobb WITH konv
Saját inicializáló metódus CREATE TYPE nyelvismeret AS ( nyelv VARCHAR(20), szint INTEGER ) CONSTRUCTOR METHOD nyelvismeret ( n1 VARCHAR(20), n2 INTEGER) RETURNS nyelvismeret; CREATE METHOD nyelvismeret ( n1 VARCHAR(20), n2 INTEGER) RETURNS nyelvismeret BEGIN SET SELF.nyelv = n1; SET SELF.szint = n2+1; RETURN SELF; END
Saját konverziós metódus CREATE TYPE nyelvismeret AS ( nyelv VARCHAR(20), szint INTEGER ) CREATE FUNCTION konv ( ni nyelvismeret) RETURNS CHAR(20) BEGIN DECLARE re CHAR(20); SET re = ni.nyelv || CAST(ni.szint AS CHAR(5)); RETURN re; END CREATE CAST (nyelvismeret AS CHAR(20)) WITH konv
Örökléshez kapcsolódó elemek CREATE TYPE os AS ( ) CREATE TYPE al UNDER os AS () A strukturált UDT-k példányai értékek és nem objektumok NEW os() NEW os(paramlista) példány létrehozás DECLARE v1 os; SET v1 = NEW os(); SET v1 = NEW al(); helyettesíthetőség elve helyettesíthetőség: minden ős osztályú hivatkozáskor egy al-osztályú példány is megadható DECLARE v1 al; SET v1 = NEW al();
CREATE TYPE dolgozo AS ( METHOD elszamol() RETURNS BOOLEAN, metódusok kezelése öröklés overloading overriding CREATE TYPE dolgozo AS ( METHOD elszamol() RETURNS BOOLEAN, METHOD novel() RETURNS INTEGER ) CREATE TYPE oktato UNDER dolgozo AS ( METHOD novel() RETURNS INTEGER, METHOD novel(IN ert INTEGER) RETURNS INTEGER OVERLOAD: ELTÉRŐ PARAMÉTEREZÉS TREAT : NEM VALTOZTATJ A MEG AZ ADATTÍPUST OVERRIDE: ELTÉRŐ HIERARCHIA (ALAPTIPUS) SET x = (gabi AS dolgozo).novel() SET x = TREAT (gabi AS dolgozo).novel()
Integritási elemek megadása az UDT táblákban CREATE TABLE táblanév UNDER tnev OF típus ( ref-szerkezet | tábla-interitás | mező-integritás ) CREATE TYPE DIAK AS ( NEV VARCHAR(30), SZDAT SZEV) CREATE TABLE s_v OF diak ( REF IS diak_id SYSTEM GENERATED szdat WITH OPTIONS o_1 CHECK szdat < SYSDATE nev WITH DEFAULT VALUE ‘PETER’
UDT táblák lekérdezése CREATE TABLE A OF T1A CREATE TABLE B UNDER A OF TB alapesetben a hierarchiában végig lekérdez SELECT * FROM B leszűkítés SELECT * FROM ONLY (B) A view-k között is értelmezhető hierarchia CREATE VIEW v1 OF t1 (REF IS DERIVED) AS SELECT… CREATE VIEW v2 OF t2 UNDER v1 AS SELECT … szigorú illeszkedési feltételek
CREATE TYPE VERSENYZO_T AS ( NEV CHAR(20), LAKCIM LAKCIM_T, CSAPAT REF(CSAPAT_T), SZULIDO DATE, PONTOK ROW ( DATUM DATE, PONTSZAM INTEGER ARRAY[3] ) NOT FINAL INSTANTIABLE INSTANCE METHOD ELETKOR () RETURNS INTEGER; CREATE INSTANCE METHOD ELETKOR () RETURNS INTEGER FOR VERSENYZO_t RETURN YEAR(SYSDATE) - YEAR(SELF.SZULIDO);