640 likes | 829 Views
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.
E N D
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. • 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?
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
Struktura typu obiektowego Specyfikacja typu Publiczny interfejs Deklaracje atrybutów Specyfikacje metod Ciało typu Prywatna implementacja Ciała metod
Tworzenie specyfikacji typu obiektowego Składnia CREATE TYPE nazwa_typu AS OBJECT [(atrybut1 typdanych, atrybut2 typdanych, . . .] [MEMBER procedura1 | funkcja1spec, procedura2 | funkcja2spec, . . .)]
Tworzenie ciała typu obiektowego Składnia CREATE TYPE BODY nazwa_typu AS [MEMBER procedura1 | funkcja1body, procedura2 | funkcja2body, . . .]END
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 ));
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;
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));
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;
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.
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.
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;
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;
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.
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(...);
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.
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.
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;
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
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;
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
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'));
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')
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;
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;
DELETE na tabeli obiektowej BEGIN DELETE FROM name_table p WHERE p.l_name = 'Janusz'; END;
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;
Tabela relacyjna • CREATE TABLE Emp1( Empno NUMBER PRIMARY KEY,Name Name_typ, -- kolumna typu obiektowegoSal NUMBER, Kier REFERENCES Emp1);
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.
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);
Użycie referencji SELECT o.name, o.Dept_Ref.name FROM obj_emp o NAME DEPT_REF.NAME -------------------- ------------------------- KOWALSKI KADRY
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.
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));
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);
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.
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);
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))
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;
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;
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);
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.
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.
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.
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';
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;
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
Foto (BLOB) Przepis (CLOB) Film (BFILE) • Atrybut typu obiektowego • Kolumna w tabeli • Wartość zmiennej w PL/SQL Duże obiekty LOB
Anatomia obiektu LOB DECLARE lobloc BLOB; BEGIN SELECT col1 INTO lobloc FROM LOB_Table WHERE col2=123; END; Lokator LOB WartośćLOB