Kihagyás

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\})\)

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

CREATE TYPE <típusnév> AS (
  <attribútumok típusaival>
);

ORACLE 🤢:

CREATE TYPE <típusnév>
AS OBJECT (
  <attribútumok típusaival>
);

UDT - Példa

CREATE TYPE BarType AS (
    name  CHAR(20),
    addr  CHAR(20),
);

CringACLE

CREATE TYPE SD_POINT_TYPE 
AS OBJECT (
    X   NUMBER,
    Y   NUMBER,
    Z   NUMBER
);

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

CREATE TYPE MenuType AS (
  bar   REF BarType,
  beer  REF BeerType,
  price     FLOAT
);

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-notation a megszokott módon működik
    • Ilyenkor az OR-t alkalmazó reláción alias használata kötelező
    • OR: Object-Relation

Szintaxis

CREATE TABLE <táblanév> OF <típusnév>;

Lekérdezéshez pedig:

SELECT bb.name, bb.addr
FROM Bars bb;

UDT Sort - Példa

CREATE TABLE Bars OF BarType;
CREATE TABLE Beers OF BeerType;
CREATE TABLE Sells OF MenuType;

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 INSERT működik

Persze mivel a sortípusú reláció unáris, a konstruktorra szükség lesz

INSERT INTO Bars VALUES (
    BarType('Joe''s Bar', 'Maple st.')
);

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
SELECT ss.beer()-> name
FROM Sells ss
WHERE ss.mar()-> name = 'Joe''s Bar';

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
SELECT ss.beer.name
FROM Sells ss
WHERE ss.bar.name = 'Joe''s Bar';

DEREF

Motiváció

SELECT ss.beer
FROM Sells ss
WHERE ss.bar.name = 'Joe''s Bar';

A kód helyes, csak mivel ss.beer hivatkozás, az eredmény nem az lesz, amit várunk

Helyes megközelítéssel:

SELECT DEREF(ss.beer)
FROM Sells ss
WHERE ss.bar.name = 'Joe''s Bar';

Metódusok (ORACLE)

  • Definiálható a CREATE TYPE-ban, vagy egy CREATE TYPE BODY utasításban
    • PL/SQL szintaxis, SELF hasonlóan mint máshol a this működik

Alap forma

CREATE TYPE BODY <típusnév> AS
  <metódus definíciók>
END;

Ahol a PROCEDURE helyén MEMBER FUNCTION van

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)

Rendezések

Rendezések - SQL-99

  • Mindegyik T UDT két metódust definiálhat EQUAL és LESSTHAN
    • Mindegyik metódus egy T bemenetet vár, és egy másik T objektumra alkalmazza (on SELF)
    • TRUE értéket csak a helyes rendezés ad
  • Lehetővé teszi, hogy T típusú objektumokon összehasonlítást alkalmazhassunk a WHERE záradékban, illetve rendezhetővé válik az ORDER BY zá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 | >0 lehet, ahogy a SELF objektumhoz 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
SELECT beers
FROM Manfs
WHERE name = 'Anheuser-Busch';

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 FROM záradékban alkalmazható
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

INSERT INTO Manfs VALUES (
  'Pete''s', 'Palo Alto',
  CAST(
    MULTISET(
        SELECT bb.beer
        FROM Beers bb
        WHERE bb.manf = 'Pete''s'
    ) AS BeerTableType
  )
);