Objektum relációs adatmodell
Relációs és az O-O modell egyesítése - Motiváció
- Összetettebb adattípusokat is elfogad
- nem csak a primitíveket
- Magas szinttű lekérdezéseket támogat
- Objektum-relációs adatmodell kísérli meg "mindkét világból a legjobbat nyújtani"
- Sokáig nem volt elég hatékony, hogy megérte volna használni
- OO megközelítéssel több előnyös tulajdonsága van, mégis megtartja a relációt az alapvető absztrakciós mechanizmusnak
Objektumrelációk
- Továbbra is relációk
- Az attribútumokhoz Strukturált típusok tartoznak
- Metódusokkal
- Sorok azonosítóival
- Hivatkozásokkal
Beágyazott relációk
- Az attribútum típusa lehet relációséma is
- Rekurzív defi
- Kiindulás: atomi típus
- Indukció: reláció típusa séma egy vagy több attribútumnévvel és azok típussal
- A típus itt lehet séma
Jelelmzően az atomi típust nem jelöljük külön, de a séma típusú attribútumot a megszokott jelöléssel beágyazzuk
pl.:
Rel1(Attr1, Attr2(Attr2A, Attr2B), Attr3)
Beágyazott relációk - Példa
- Oktattókhoz tervezünk egy beágyazott relációsémát
- Tartalmazzon nevet és TAJ-t
- Ezek legyenek atomi típusuak
- Tartalmazzon egy tárgyak attribútumot, ami séma legyen
- Tárgynévvel
- Tárgykóddal
- Hasonlóan legyen egy címek relációja is
- Várossal
- Közterülettel
Kapott séma : Oktatók(név, TAJ, címek(város, közterület), tárgyak(tárgynév, kód))
Kimenet:
| név | TAJ | címek | tárgyak |
|---|---|---|---|
| Nagy Morgána | 123 456 789 | $$\small\begin{array}{ | c |
| Nagy Morgána | 123 456 789 | $$\small\begin{array}{ | c |
Hivatkozások
Ez a példa így nem kóser, látjuk, hogy redundancia lehet (pl a tárgyaknál)
Hivatkozásokra lenne szükség
- Újjabb indukciós szabály: egy attribútum típusa nem csak reláció, de relációra hivatkozás is lehet
- Jelölés:
- Amikor \(A\) típusa egy \(R\) relációsémájú sorhivatkozás
- \(A(^*R)\)
- Ha \(A\) típusa egy \(R\) sémájú sorok halamza
- \(A(\{^*R\})\)
- Amikor \(A\) típusa egy \(R\) relációsémájú sorhivatkozás
Ezt elvégezve az előző példában ugyanazokra a sorokra fognak a tárgyakban mutatni
SQL-99 és ORACLE
Basically sun and moon
- A gondolat nem volt nagy szabvány, így implementációban gyakran eltérnek a DBMS-ek
- Példákban az Oracle szintaxis lessz tovább látható
UDT - Felhasználó által definiált típus
- Azonos "típusú" objektumok osztályt alkotnak
- Viselkedését a hozzárendelt metódusok fejezik ki
Álltalánosan
ORACLE 🤢:
UDT - Példa
CringACLE
Objektumok hivatkozásai - OID
- Ha \(T\) egy UDT, akkor \(REF T\) a \(T\)-re mutató hivatkozás típusa
- Egy OID élete végéig azonosít egy objektumot, függetlenül annak komponenseinek értékeiről
REF - Példa
UDT Sort
- Egy relációs táblát akár egy sortípus-sal is definiálható az elemek felsorolása helyett
- ORAngLE-ben a
dot-notationa megszokott módon működik- Ilyenkor az OR-t alkalmazó reláción alias használata kötelező
- OR: Object-Relation
Szintaxis
Lekérdezéshez pedig:
UDT Sort - Példa
UDT - SQL-99 specific
- Minden UDT-nek vannak generátorai és mutátorai
- Generátor előállít UDT elemet
- Mutátor megváltoztatja az értékét
Beszúrás - SQL-99
Mutátorok és generátorok(típuskonstruktorok) használatára lesz szükség
Amint az objektumunkkal megvagyunk, jöhet is az
INSERT
SET newBar = BarType();
newBar.name('Joe''s Bar');
newBar.addr('Maple St.');
INSERT INTO Bars VALUES(newBar);
Beszúrás - ORACLE
A szabványos
INSERTműködikPersze mivel a sortípusú reláció unáris, a konstruktorra szükség lesz
UDT oszloptípusok
- Attribútumnak lehet UDT típusa
- Ugyanúgy lehet az UDT-t használni, mint az attribútumoknál megszokott primitív típusokat
CREATE TYPE AddrType AS (
street CHAR(20),
city CHAR(20),
zip INT
);
CREATE TABLE Drinkers (
name CHAR(30),
addr AddrType,
favBeer BeerType
);
REF
Hivatkozások követése - SQL-99
- \(A\to B\) akkor értelmes, ha
- Ha \(A\) egy \(REF T\) típusú
- \(T\) nek komponense \(B\)
- Az \(A\) által hivatkozott objektum \(B\) mezőjének értékét jelöli
A komponenshez hozzáférést a generátor metódust használjuk fel...
Hivatkozások követése - ORACLE
- REF-ek követése implicit
DEREF
Motiváció
A kód helyes, csak mivel ss.beer hivatkozás, az eredmény nem az lesz, amit várunk
Helyes megközelítéssel:
Metódusok (ORACLE)
- Definiálható a
CREATE TYPE-ban, vagy egyCREATE TYPE BODYutasításban- PL/SQL szintaxis,
SELFhasonlóan mint máshol athisműködik
- PL/SQL szintaxis,
Alap forma
Ahol a
PROCEDUREhelyénMEMBER FUNCTIONvan
Metódus - Példa
CREATE TYPE MenuType AS OBJECT (
bar REF BarType
beer REF BeerType
price FLOAT
MEMBER FUNCTION priceInYen(rate IN FLOAT) RETURN FLOAT,
PRAGMA RESTRICT_REFERENCES(priceInYen, WNDS)
);
No 🧢, they came up with this as an example, so I guess PL/SQL class is needed
- A metódusokat a megszokott
dot-notationés a függvényaplikáció operátorával lehetséges- pl.:
ss.priceInYen(114.0)
- pl.:
Rendezések
Rendezések - SQL-99
- Mindegyik
TUDT két metódust definiálhatEQUALésLESSTHAN- Mindegyik metódus egy
Tbemenetet vár, és egy másikTobjektumra alkalmazza (onSELF) TRUEértéket csak a helyes rendezés ad
- Mindegyik metódus egy
- Lehetővé teszi, hogy
Ttípusú objektumokon összehasonlítást alkalmazhassunk aWHEREzáradékban, illetve rendezhetővé válik azORDER BYzáradékban
Rendezések - ORACLE
- Bármely UDT típusra bármelyik metódust rendező metúdusnak deklarálhatjuk
- A rendező metódusok visszatérő értéke INT:
<0|=0|>0lehet, ahogy aSELFobjektumhoz viszonyítva az argumentum értéke hogyan viszonyul (a szám mérete nem releváns)
CREATE TYPE BarType AS OBJECT (
name CHAR(20),
addr CHAR(20),
ORDER MEMBER FUNCTION before(bar2 IN BarType)
RETURN INT
PRAGMA RESTRICT_REFERENCES(before, WNDS, RNDS, WNPS, RNPS)
);
CREATE TYPE BODY BarType AS
ORDER MEMBER FUNCTION
before(bar2 BarType) RETURN INT IS
BEGIN
IF SELF THEN RETURN -1;
ELSIF SELF.name = bar2.name THEN RETURN 0;
ELSE RETURN 1;
END IF;
END;
Beágyazott relációk
- Oracle valójában nem tárolja el a beágyazott relációkat külön relációként
- Ikr
- Ehelyett, egy gyűjtő \(R\) relációba sokasodik egy \(A\) attribútumra az összes beágyazott táblázat
- Annak minden sorával oc
- Alak:
CREATE TABLE <> ( <> ) NESTED TABLE <A> STORE AS <R> - Beágyazott tábláknak beágyazott táblái is megadhatók így
- Zárójelekre figyelni
CREATE TABLE (
name CHAR(30)
addr CHAR(30)
beers BeerTableType
)
NESTED TABLE beers STORE AS BeerTable;
CREATE TABLE (
aruhaz_id NUMBER
nap DATE,
vevok vevo_tab )
NESTED TABLE vevok STORE AS aruhaz_vevok
( NESTED TABLE cimek STORE AS aruhaz_cimek);
Lekérdezésük
- Bármely beágyazott táblázat ugyanúgy megjeleníthető, nyomtatható, mint bármilyen más érték
- Az alábbi értékeknek van típuskonstruktorokra
- Tábláknak
- Soroknak a táblában
eredménye:
BeerTableType(BeerType('Bud','lager','yellow'),BeerType('Lite','malt','pale'), ... )
- Az eredmény hagyományos relációvá alakítható a
TABLE()függvénnyel- Az így kapott reláció a
FROMzáradékban alkalmazható
- Az így kapott reláció a
SELECT bb.name
FROM TABLE(
SELECT beers
FROM Manfs
WHERE name = 'Anheuser-Busch'
) bb
WHERE bb.kind = 'ale';
Táblává alakítás - CAST
- Bármely reláció megfelelő számú és illeszkedő attribútummal egy beágyazott tábla értékei lehetnek
- Erre van a
CAST (MULTISET(...) AS <type>)utasítás
Táblává alakítás - Példa
Adottak a:
CREATE TABLE BeerType AS OBJECT (
name CHAR(20),
kind CHAR(10),
color CHAR(10)
);
--
CREATE TABLE Manfs (
name CHAR(30),
addr CHAR(50),
beers BeerTableType
)
NESTED TABLE beers STORE AS BeerTable;
alkalmazva pedig