Objektum relcis adatmodell Objektum orientlt adatmodellek OOPPD RDBMS
Objektum relációs adatmodell
Objektum orientált adatmodellek OOPPD RDBMS OODBMS ORDBMS 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 atomi típusok struktúra ODL kapcsolatok relationship céltípus knev [ inverse knev 2 ] halmaz multihalmaz tömb ODL metótusok mnev (paraméterlista) raises (kivétel); lista ODL integritási felt. key (attributumlista)
Öröklés interface class interface onév : ős-i{ … } literal 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; integer year; integer length; enumeration(color, black. And. White) film. Type; relationship Set stars inverse Star: : starred. In; relationship Studio owned. By inverse Studio: : owns; float length. In. Hours() raises (no. Length. Found); star. Names(out Set); other. Movies(in Star, out Set) raises(no. Such. Star); };
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: m 1. m 2. m 3… m 1 m 2 m 3 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()
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. owned. By. name = "Disney" Az azonos helyen lakó sztárok párjai? select distinct Struct(star 1: s 1, star 2: s 2) from Stars s 1, Stars s 2 where s 1. addr = s 2. addr and s 1. name < s 2. name
A Disney filmekben szereplők nevei rendezve? select distinct s. name from (select m from Movies m where m. owned. By. 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. starred. In : m. owned. By. name = "Disney" A filmek átlagos hossza? avg(select m. length from Movies m)
select std, yr, sum. Length: 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
(select distinct m from Movies m, m. stars s where s. name = "Harrison Ford") except (select distinct m from Movies m where m. owned. By. 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 hallgató engedélyek szak beiratkozás index bejegyzés félév tanszék 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
SQL 1999 1975: SEQUEL SQL 86 SQL 89 SQL 92 SQL 1999 (SQL 3) SQL 2003 (SQL 4) SQL-FRAMEWORK SQL-FOUNDATION SQL-CLI SQL-PSM SQL-BINDINGS SQL-MED SQL-OLB SQL-JRT SQL-XML SQL-OLAP …
SQL 1999 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 struktúra típus érték 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] típus : gyári UDT rugalmasan konstruálható
gyári adattípusok (bővebb mint SQL 92) INTEGER NUMERIC(N, M) REAL FLOAT(M) CHAR(N) VARCHAR(N) CLOB BIT(N) BLOB DATE 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] ) nincs LIST, BUG, . . itt nem állhat NOT NULL, . . PRIMARY KEY, . .
Hivatkozás az adatelemekre objektum. tag…. de! : SQL parancsokban csak alias-néven keresztül lehet struktúra elemekre hivatkozni SELECT vevok. nev, vevok. cím. utca FROM vevok SELECT vevok. nev, vevok. cím. utca WHERE vevok. id = 34 FROM vevok, vevok. cim SELECT c. nev, c. cím. utca, d. utca FROM vevok AS c, vevok. cím AS d WHERE c. id = 34 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); UPDATE dolgozo SET nyelv = NEW NYELVISMERET(nyelvi, 3); UPDATE dolgozo SET nyelv = nyelv. szint(3); UPDATE dolgozo 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 a hivatkozott objektum eleme DEREF(mm) a teljes hivatkozott objektum
CREATE TYPE CSAPAT_T AS ( NEV CHAR(20), LETSZAM NUMBER(3) SZEKHELY CÍM); CREATE TYPE JATEKOS_T AS ( NEV CHAR(20), CSAPAT REF (CSAPAT_T) ) INSTANTIABLE NOT FINAL ; még nem lehet a NEW operátort használni 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 …
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 m 1. m 2. 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: MUTATOR: CONSTRUCTOR: STATIC: diak. nev() diak. nev(”Peter”) NEW diak() 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 ( n 1 VARCHAR(20), n 2 INTEGER) RETURNS nyelvismeret; CREATE METHOD nyelvismeret ( n 1 VARCHAR(20), n 2 INTEGER) RETURNS nyelvismeret BEGIN SET SELF. nyelv = n 1; SET SELF. szint = n 2+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 v 1 os; SET v 1 = NEW os(); SET v 1 = NEW al(); helyettesíthetőség elve DECLARE v 1 al; SET v 1 = NEW al();
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 ) 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 T 1 A 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 v 1 OF t 1 (REF IS DERIVED) AS SELECT… CREATE VIEW v 2 OF t 2 UNDER v 1 AS SELECT … szigorú illeszkedési feltételek
CREATE TYPE VERSENYZO_T AS ( NEV CHAR(20), 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);
- Slides: 43