1 / 64

Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle

Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle. Wyk ł ad 4. Rodzaje obiekt ó w. Obiekty typ ó w obiektowych Duże obiekty LOB Java składowana w bazie danych. Zasadnicze pytanie. Bazy danych są na ogół relacyjne, a aplikacje klienckie obiektowe.

Download Presentation

Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Obiektowość w obiektowo-relacyjnych bazach danych na przykładzie Oracle Wykład 4

  2. Rodzaje obiektów • Obiekty typów obiektowych • Duże obiekty LOB • Java składowana w bazie danych

  3. Zasadnicze pytanie • Bazy danych są na ogół relacyjne, a aplikacje klienckie obiektowe. • Dlaczego nie przejść na bazy danych obiektowe? • Prawe wszystkie dane są aktualnie przechowywane w tabelach relacyjnych. • Obiektowe bazy danych wydają się być mniej wydajne. • Relacyjne bazy danych mogą być projektowane i używane przez osoby, które nie są programistami. • Jak zbliżyć do siebie oba niespójne względem siebie modele danych?

  4. Typ obiektowy • Złożony typ danych definiowany przez użytkownika. • Hermetyzuje strukturę danych łącznie z metodami potrzebnymi do operowania na strukturze danych. Wyślij Atrybut Id_zam Info_klient Pozycje Status Anuluj Wyśw_Status Metoda Zatrzymaj

  5. Struktura typu obiektowego Specyfikacja typu Publiczny interfejs Deklaracje atrybutów Specyfikacje metod Ciało typu Prywatna implementacja Ciała metod

  6. Tworzenie specyfikacji typu obiektowego Składnia CREATE TYPE nazwa_typu AS OBJECT [(atrybut1 typdanych, atrybut2 typdanych, . . .] [MEMBER procedura1 | funkcja1spec, procedura2 | funkcja2spec, . . .)]

  7. Tworzenie ciała typu obiektowego Składnia CREATE TYPE BODY nazwa_typu AS [MEMBER procedura1 | funkcja1body, procedura2 | funkcja2body, . . .]END

  8. Przykład SQL> CREATE TYPE name_typ AS OBJECT( f_name VARCHAR2(25), l_name VARCHAR2(25), initials VARCHAR2(7), MEMBER FUNCTION full_name RETURNVARCHAR2, PRAGMA RESTRICT_REFERENCES( full_name, WNDS, RNDS, WNPS, RNPS ));

  9. Przykład SQL> CREATE TYPE BODY name_typ AS MEMBER FUNCTION full_name RETURN VARCHAR2 IS BEGIN RETURN (l_name || ' ' || f_name ); END full_name; END;

  10. Przykład SQL> CREATE TYPE emp_typ AS OBJECT( emp_id NUMBER(7), name name_typ, -- typ obiektowy street VARCHAR2(25), city VARCHAR2(15), state CHAR(2), zip INTEGER, MEMBER FUNCTION get_name RETURN VARCHAR2, PRAGMA RESTRICT_REFERENCES(get_name, WNDS, RNDS, WNPS, RNPS), MEMBER PROCEDURE set_l_name (v_name VARCHAR2));

  11. Przykład SQL> CREATE TYPE BODY emp_typ AS MEMBER FUNCTION get_name RETURN VARCHAR2 IS BEGIN RETURN (name.l_name ||' '|| name.f_name); END; MEMBER PROCEDURE set_l_name (v_name VARCHAR2) IS BEGIN name.l_name := v_name; END; END;

  12. Rodzaje metod • MEMBER – z niejawnym pierwszym parametrem SELF – definiowanego typu danych. • Metody służące do porównywania obiektów. • STATIC – bez SELF; wywoływane type_name.method(np. metody konstruktorów obiektów definiowane przez użytkowników). • Implementowane w PL/SQL, Java, C.

  13. Rodzaje metod • Metody konstruktorów obiektów – jeden zdefiniowany przez system (parametrami są atrybuty obiektu), inne przez użytkownika. • Metody porównywania: • MAP – przez odwzorowanie układu wartości atrybutów na liczbę; • ORDER – bezpośrednio wylicza wynik porównania dwóch obiektów < to -1, = to 0, > to 1.

  14. MAP CREATE TYPE rectangle_typ AS OBJECT ( len NUMBER, wid NUMBER, MAP MEMBER FUNCTION area RETURN NUMBER); CREATE TYPE BODY rectangle_typ AS MAP MEMBER FUNCTION area RETURN NUMBER IS BEGIN RETURN len * wid; END area; END;

  15. ORDER CREATE TYPE location_typ AS OBJECT( building_no NUMBER, city VARCHAR2(40), ORDER MEMBER FUNCTION match (l location_typ) RETURN INTEGER ); CREATE TYPE BODY location_typ AS ORDER MEMBER FUNCTION match (l location_typ) RETURN INTEGER IS BEGIN IF building_no < l.building_no THEN RETURN -1; ELSIFbuilding_no > l.building_no THEN RETURN 1; ELSE RETURN 0; END IF; END; END;

  16. Dziedziczenie (jednokrotne) SQL> CREATE TYPE Person AS OBJECT ( first VARCHAR2(50), last VARCHAR2(50)) NOT FINAL; SQL>CREATE TYPE Emp UNDER Person( salary NUMBER) FINAL; SQL> DECLARE x Emp:=Emp('Jan','Kowalski',10000); BEGIN DBMS_OUTPUT.Put_line(x.first||' '||x.last ||' '||x.salary); END; NOT FINAL – wymagane aby móc definiować podtypy.

  17. Typ bez instancji NOT INSTANTIABLE Nie posiada konstruktora. Nie można tworzyć obiektów tego typu. • CREATE TYPE Address_t AS OBJECT(...) NOT INSTANTIABLE NOT FINAL; • CREATE TYPE USAddress_t UNDER Address_t(...); • CREATE TYPE IntlAddress_t UNDER Address_t(...);

  18. Metoda bez instancji NOT INSTANTIABLE • Typ nie dostarcza implementacji metody. • Typ, który zawiera metody bez instancji, musi sam być NOT INSTANTIABLE. • Typ bez instancji może być definiowany jako podtyp typu z instancjami. • Typ bez instancji nie może być FINAL.

  19. Polimorfizm Przedefiniując dziedziczone metody w podtypie mamy możliwość zdefiniowania innego sposobu wykonania metod na obiektach podtypu. Obiekt podtypu może być użyty w kodzie w miejsce obiektu nadtypu – definiując dla różnych podtypów różne działania.

  20. Przesłanianie CREATE TYPE Figure AS OBJECT ( NOT INSTANTIABLE MEMBER FUNCTION area RETURN NUMBER ) NOT INSTANTIABLE NOT FINAL; CREATE TYPE Rect UNDER Figure ( x NUMBER, y NUMBER, OVERRIDING MEMBER FUNCTION area RETURN NUMBER); CREATE TYPE BODY Rect AS OVERRIDING MEMBER FUNCTION area RETURN NUMBER IS BEGIN RETURN x*y; END; END;

  21. Informacje w słowniku danych Oracle • Informacje o typach obiektowych znajdują się w • USER_OBJECTS • Informacje o metodach typów obiektowych znajdują się w • USER_METHOD_PARAMS, • USER_METHOD_RESULTS, • USER_TYPE_METHODS

  22. Tworzenie tabeli obiektowej i wywoływanie metod SQL> CREATE TABLE name_table OF name_typ; SQL> INSERT INTO name_table VALUES('Marilyn','Monroe','MM'); SQL> SELECT nt.f_name, nt.full_name() FROM name_table nt;

  23. Widoki tabeli obiektowej • Tabela jedno-kolumnowa: każdy wiersz jest obiektem; można wykonywać operacje obiektowe. • Tabela wielokolumnowa: każdemu atrybutowi obiektu odpowiada jedna kolumna. Rodzaje obiektów • wierszowe • kolumnowe

  24. Metoda konstruktora obiektu SQL> CREATE TYPE tv_type AS OBJECT ( tv_category VARCHAR2(20), screen_size NUMBER(4)); DECLARE v_new_tv tv_type := tv_type('WEB tv', 32); v_alt_tv tv_type; BEGIN v_alt_tv := tv_type('Big Screen', 72); END; • SQL> CREATE TABLE tv OF tv_type; • SQL> INSERT INTO tv VALUES(tv_type('Color tv', '28'));

  25. SELECT na tabeli obiektowej Wynikiem zbiór wierszy: SELECT * FROM name_table p WHERE p.l_name LIKE 'M%'; Wynikiem zbiór obiektów: SELECT VALUE(p) FROM name_table p WHERE p.l_name LIKE 'M%'; „Kanoniczna” reprezentacja obiektu w SQL*Plus: -- NAME_TYP('Marilyn','Monroe','MM')

  26. INSERT do tabeli obiektowej Bezpośrednio: BEGIN INSERT INTO name_table VALUES('Marilyn','Monroe','MM');END; Z użyciem konstruktora typu obiektowego: BEGIN INSERT INTO name_table VALUES(name_typ('Marilyn','Monroe','MM')); END;

  27. UPDATE na tabeli obiektowej BEGIN UPDATE name_table p SET p.l_name = 'Janusz' WHERE p.l_name = 'Jan'; END; Z użyciem konstruktora typu obiektowego: BEGIN UPDATE name_table p SET p = name_typ('Janusz','Kowalski','JK') WHERE p.l_name = 'Jan'; END;

  28. DELETE na tabeli obiektowej BEGIN DELETE FROM name_table p WHERE p.l_name = 'Janusz'; END;

  29. Funkcja VALUE i pseudokolumna OBJECT_VALUE SELECT VALUE(p) SELECT OBJECT_VALUEFROM person_obj_table p; FROM person_obj_table; Można ograniczyć do obiektów z podtypu: SELECT VALUE(p) FROM person_obj_table p WHERE VALUE(p) IS OF (part_time_student_typ); -- lub SELECT VALUE(p) FROM person_obj_table p WHERE VALUE(p) IS OF (ONLY part_time_student_typ); Można użyć do UPDATE: UPDATE person_obj_table p SET VALUE(p) = person_typ(12, 'Bob Jones', '1-800-555-1243') WHERE p.idno = 12;

  30. Tabela relacyjna • CREATE TABLE Emp1(   Empno NUMBER PRIMARY KEY,Name Name_typ,   -- kolumna typu obiektowegoSal NUMBER,   Kier REFERENCES Emp1);

  31. OID, REF • Każdy obiekt wierszowy jest jednoznacznie identyfikowany przez swój systemowy, obiektowy identyfikator OID, 16 bajtowy – stanowiący dodatkową, indeksowaną, jednoznaczną kolumnę w tabeli obiektowej (opcja OBJECT IDENTIFIER IS SYSTEM GENERATED w CREATE TABLE) – opcja domyślna. • Gdy istnieje klucz główny, można jego wartości użyć jako OID (opcja OBJECT IDENTIFIER IS PRIMARY KEY w CREATE TABLE). • Referencja REF – logiczny wskaźnik do obiektu wierszowego konstruowany z OID obiektu i metadanych.

  32. Typ referencyjny CREATE TYPE Dept_Type AS OBJECT( Name VARCHAR2(10), Loc VARCHAR2(50)); CREATE TYPE Emp_Type AS OBJECT( Name VARCHAR2(20), Sal Number, Dept_ref REF Dept_Type ); CREATE TABLE Obj_Emp OF Emp_Type (Dept_ref SCOPE IS Obj_Dept); CREATE TABLE Obj_Dept OF Dept_Type; CREATE TABLE Rel_emp( Id NUMBER PRIMARY KEY, Name VARCHAR2(20), Sal Number, Dept_ref REF Dept_Type SCOPE IS Obj_Dept);

  33. Użycie referencji SELECT o.name, o.Dept_Ref.name FROM obj_emp o NAME DEPT_REF.NAME -------------------- ------------------------- KOWALSKI KADRY

  34. Użycie referencji DECLAREx REF Dept_Type;BEGIN   SELECT REF(o) INTO x FROM obj_dept o WHERE o.name='KADRY';   INSERT INTO obj_emp VALUES('KOWALSKI',2000,x);END; Operatory: REF(o) – referencja do obiektu o DEREF(x) – obiekt o referencji x.

  35. Tworzenie tabeli obiektowej z obiektami różnych podtypów CREATE TABLE person_obj_table OF person_typ; INSERT INTO person_obj_table VALUES (person_typ(12, 'Bob Jones', '111-555-121')); INSERT INTO person_obj_table VALUES (student_typ(5, 'Joe Lan', ‘6555-131', 12, 'HISTORY')); INSERT INTO person_obj_table VALUES (employee_typ(55, 'Jane Smith', ‘6555-776', 100, 'Jennifer Nelson')); INSERT INTO person_obj_table VALUES (part_time_student_typ(52, 'Kim Patel', '1555-1232', 14, 'PHYSICS', 20));

  36. Ograniczanie wartości w kolumnie tabeli obiektowej CREATE TYPE office_typ AS OBJECT (office_id VARCHAR(10), location location_typ, occupant person_typ ) NOT FINAL; CREATE TABLE office_tab OF office_typ COLUMN occupant IS OF (ONLY employee_typ);

  37. Kolekcje • Atrybut typu obiektowego lub kolumna tabeli może być typu kolekcji: • 1. VARRAY – typ tablicy jednowymiarowej (jak wektor) o ustalonym maksymalnym rozmiarze; • 2. TABLE – typ tabeli zagnieżdżonej o nie ustalonym maksymalnym rozmiarze.

  38. Przykład • CREATE TYPE Projekt AS OBJECT ( Num_proj NUMBER(3), Tytuł VARCHAR2(35), Koszt NUMBER(7,2)); • CREATE TYPE Lista AS VARRAY(3) OF Projekt; • CREATE TABLE Wydziały ( Id_wydz NUMBER(2), Nazwa VARCHAR2(15),Budżet NUMBER(11,2), Projekty Lista);

  39. Przykład c.d. • INSERT INTO Wydziały VALUES(1,'Informatyka',100000, Lista(Projekt(1,'Analiza',123), Projekt(2,'Projekt',456))); • SELECT w.Projekty FROM Wydziały wWHERE w.Nazwa = ‘Informatyka’; • Projekty-------------------------------------------------------------------------------LISTA(PROJEKT(1,'Analiza',123),PROJEKT(2,'Projekt',456))

  40. Kolekcje w PL/SQL • CREATE OR REPLACE PROCEDURE Wypisz AS   lis Lista;BEGIN   FOR z IN (SELECT * FROM Wydzialy) LOOP      DBMS_OUTPUT.Put_line('Proj. Wydziału: '||z.Nazwa);      lis:=z.Projekty;      FOR i IN 1..lis.Count LOOP DBMS_OUTPUT.Put_line(lis(i).Num_proj||' '||lis(i).Tytul);      END LOOP;   END LOOP;END;

  41. Cykliczność powiązań • CREATE TYPE Dept_Type; -- niepełna specyfikacja typu Dept_Type • CREATE TYPE Emp_TypeAS OBJECT(   Name VARCHAR2(20),   Sal NUMBER,   Dept_ref REF Dept_Type);  • CREATE TYPE Pracownicy AS VARRAY(100) OF REF Emp_Type;

  42. CREATE TYPE Dept_Type  -- powtórna, pełna specyfikacja typu Dept_TypeAS OBJECT(   Name VARCHAR2(10),   Loc VARCHAR2(50),   Kadra Pracownicy); • CREATE TABLE Obj_Dept OF Dept_Type; • CREATE TABLE Obj_Emp OF Emp_Type(Dept_ref SCOPE IS Obj_Dept);

  43. Składowanie obiektów • Każdy obiektowy typ danych określa drzewo, w którego liściach znajdują się: • atrybuty prostych typów danych jak NUMBER, VARCHAR2 lub REF; • atrybuty typów kolekcji; • atrybuty typów obiektowych rozwijają się w poddrzewa odpowiadające ich typom, jak również w poddrzewa wszystkich podtypów ich typów. • Tabela obiektowa jest reprezentowana przez tabelę relacyjną, której kolumny odpowiadają atrybutom tego drzewa plus kolumny odpowiadające atrybutom drzew wszystkich podtypów danego typu.

  44. Składowanie obiektów • Oracle dodaje dodatkowe kolumny do tworzonej tabeli relacyjnej: • dla generowanego przez system OID obiektu; • dla każdego reprezentowanego typu – wartość logiczna czy NULL; • dla każdego reprezentowanego typu posiadającego podtypy kolumnę określającą podtyp aktualnego obiektu (typeid). • VARRAY jest zapisywane jako pojedyncza wartość INLINE lub BLOB. • Dla kolumny typu tabeli zagnieżdżonej jest określona jedna tabela relacyjna z wierszami wszystkich tabel zagnieżdżonych zapisywanej w tej kolumnie.

  45. Perspektywy obiektowe • Alternatywnie, można samemu zdefiniować relacyjną bazę danych i udostępniać ją jako obiektową za pomocą perspektyw obiektowych. • Zdefiniowanie typu obiektowego: atrybuty odpowiadają istniejącym kolumnom tabel relacyjnych. • Zapisanie zapytania określającego jak wydobywać dane z tabel relacyjnych – kolumny w takiej kolejności jak atrybuty typu obiektowego. • Określenie jednoznacznego identyfikatora umożliwiającego tworzenie wskaźników do obiektów w perspektywie (np. istniejący klucz główny). • W przypadku złożonej perspektywy można użyć wyzwalaczy INSTEAD OF do przeprowadzania modyfikacji danych w perspektywie obiektowej.

  46. Przykład • CREATE TABLE emp_table (empnum NUMBER (5), ename VARCHAR2 (20), salary NUMBER (9,2), job VARCHAR2 (20)); • CREATE TYPE employee_t AS OBJECT (empno NUMBER (5), ename VARCHAR2 (20), salary NUMBER (9,2), job VARCHAR2 (20)); • CREATE VIEW emp_view OF employee_t WITH OBJECT IDENTIFIER (empno) AS SELECT e.empnum, e.ename, e.salary, e.job FROM emp_table e WHERE e.job = 'Developer';

  47. REFERENCJE w perspektywie obiektowej CREATE TYPE dept_t AS OBJECT ( deptno NUMBER, deptname VARCHAR2(20), address address_t); CREATE VIEW dept_view OF dept_t WITH OBJECT IDENTIFIER (deptno) AS SELECT d.deptno, d.deptname,address_t(d.deptstreet,d.deptcity,d.deptstate,d.deptzip) AS deptaddrFROM dept d; CREATE TYPE emp_t AS OBJECT ( empno NUMBER, ename VARCHAR2(20), salary NUMBER, deptref REF dept_t); CREATE OR REPLACE VIEW emp_view OF emp_t WITH OBJECT IDENTIFIER(empno) AS SELECT e.empno, e.empname, e.salary, MAKE_REF(dept_view, e.deptno) FROM emp e;

  48. Podtabela (nie w Oracle) CREATE TABLE demo_table ( id INTEGER PRIMARY KEY, txtdata VARCHAR(20)) ; CREATE TABLE demo_sub_table ( new_col VARCHAR(10), UNDER demo_table ) ; Wiersze wstawione do nad-tabelidemo_table, nie są widoczne przez select na pod-tabeli. Wiersze wstawione do pod-tabeli są widoczne przez select na nad-tabeli. W oparciu o: http://docs.openlinksw.com/virtuoso/CREATETABLE.html#under

  49. Foto (BLOB) Przepis (CLOB) Film (BFILE) • Atrybut typu obiektowego • Kolumna w tabeli • Wartość zmiennej w PL/SQL Duże obiekty LOB

  50. Anatomia obiektu LOB DECLARE lobloc BLOB; BEGIN SELECT col1 INTO lobloc FROM LOB_Table WHERE col2=123; END; Lokator LOB WartośćLOB

More Related