Download as pdf or txt
Download as pdf or txt
You are on page 1of 34

1

OBIEKTOWE BAZY DANYCH

TABELE OBIEKTOWE

Opracowanie: dr inż. Ewelina Piotrowska


e.piotrowska@po.opole.pl
www.e.piotrowska.po.opole.pl

Aktualizacja: 2023-11-28

Politechnika Opolska | Opole University of Technology | www.po.opole.pl


Wydział Elektrotechniki, Automatyki i Informatyki| www.we.po.opole.pl
OPOLE 2018 Instytut Informatyki | www.ii.po.opole.pl
Tabele obiektowe
2

 Po zdefiniowaniu typów obiektowych powstaje możliwość


tworzenia tabel obiektowych, zawierających atrybuty typu
obiektowego.
 Tabela obiektowa jest logicznie i fizycznie podobna do tabeli
relacyjnej, której typy kolumn odpowiadają najwyższemu
poziomowi atrybutów typu obiektowego przechowywanego w
tabeli obiektowej.
 Różnica polega na tym, że tabela obiektowa opcjonalnie może
zawierać dodatkową kolumnę zawierającą identyfikator obiektu
(OID).
Składania polecenia (w najprostszej postaci)

 Polecenie to pozwala na:


 określenie wartości domyślnych dla poszczególnych kolumn tabeli;
 zdefiniowanie ograniczeń dla poszczególnych kolumn tabeli;
 określenie sposobu identyfikacji obiektów (wierszy tabeli obiektowej);
 określenie sposobu przechowywania tabel zagnieżdżonych oraz tablic VARRAY.
Składania polecenia (w najprostszej postaci)
Składania polecenia (w najprostszej postaci)
Składania polecenia (w najprostszej postaci)
Ograniczenia na atrybutach
8

 Analogicznie jak dla kolumn tabel relacyjnych, na atrybuty tabel obiektowych


można nakładać ograniczenia, za wyjątkiem kolumn zawierających referencje
obiektowe REF z nieograniczonym zakresem (ang. not scoped).
 Definicja ograniczenia zawiera słowo kluczowe CONSTRAINT, nazwę oraz
definicję ograniczenia.
 W poniższym przykładzie zdefiniowano klucz główny dla kolumny id_osoba
tabeli obiektowej osoba_zewn_objtab :

CREATE TYPE lokalizacja_objtyp AS OBJECT (


nr_budynku NUMBER,
miasto VARCHAR2(40) );
CREATE TYPE osoba_objtyp AS OBJECT (
id_osoba NUMBER,
nazwisko VARCHAR2(100),
adres VARCHAR2(100),
biuro lokalizacja_objtyp );
CREATE TABLE osoba_zewn_objtab OF osoba_objtyp (id_osoba PRIMARY KEY
);
Tabele zagnieżdżone
9

 Oracle przechowuje wiersze tabeli


zagnieżdżonej w odrębnej tabeli składowej.
 Do połączenia wierszy w tabeli macierzystej z
wierszami tabeli zagnieżdżonej służy ukryta
kolumna NESTED_TABLE_ID o szerokości 16
bajtów wygenerowana przez system.
 Powiązanie tabeli macierzystej z tabelą
zagnieżdżoną przedstawiono na rysunku:
Tabela zagnieżdżoną o organizacji indeksowej (OIT)
10

 Jeżeli tabela zagnieżdżona posiada klucz główny, to


może mieć organizację indeksową (IOT).
 W takim przypadku kolumna NESTED_TABLE_ID jest
prefiksem klucza głównego dla danego wiersza
tabeli macierzystej, a Oracle fizycznie łączy
wiersze tabeli zagnieżdżonej
odpowiadające danemu wierszowi tabeli
macierzystej.
 Daje to możliwość szybkiego dostępu do
wszystkich wierszy tabeli zagnieżdżonej,
odpowiadających danemu
wierszowi tabeli macierzystej.
Zastosowanie klauzuli COMPRESS
11

 W przypadku organizacji indeksowej, prefiks


określający wiersz tabeli macierzystej, któremu
odpowiada dany wiersz tabeli zagnieżdżonej, jest
zapisywany w każdym wierszu tabeli zagnieżdżonej.
 Zastosowanie klauzuli COMPRESS podczas
tworzenia tabeli zagnieżdżonej powoduje,
że prefiks określający wiersz tabeli
macierzystej zapisywany jest w tabeli
zagnieżdżonej tylko raz, dla wszystkich
wierszy tabeli zagnieżdżonej,
odpowiadających danemu
wierszowi tabeli macierzystej
Zagnieżdżanie pośrednie
12

 Kolekcje można także zagnieżdżać w sposób pośredni, poprzez


zastosowanie referencji REF.
 Można utworzyć tabelę zagnieżdżoną typu obiektowego
zawierającą atrybut wskazujący obiekt o atrybucie w postaci tabeli
zagnieżdżonej lub tablicy VARRAY.
 Kiedy nie ma potrzeby dostępu do wszystkich elementów
wielopoziomowej kolekcji, zagnieżdżanie kolekcji z referencjami
REF może zapewnić lepszą wydajność.
Zagnieżdżanie pośrednie - przykład
13

 Załóżmy, że chcemy utworzyć nowy typ obiektowy osoba_objtyp używający


typów obiektowych: nazwisko_objtyp, adres_objtyp, oraz telefon_ntabtyp
CREATE TYPE nazwisko_objtyp AS OBJECT (
imie1 VARCHAR2(15),
imie2 VARCHAR2(15),
nazwisko VARCHAR2(15));

CREATE TYPE adres_objtyp AS OBJECT (


CREATE TYPE osoba_objtyp AS OBJECT (
ulica VARCHAR2(200),
id NUMBER(4),
miasto VARCHAR2(200),
nazwisko_obj nazwisko_objtyp,
wojew CHAR(2),
adres_obj adres_objtyp,
kod VARCHAR2(20)); telefony_ntab telefon_ntabtyp);

CREATE TYPE telefon_objtyp AS OBJECT (


miejsce VARCHAR2(15),
numer VARCHAR2(14));

Ponieważ każda osoba może posiadać


więcej niż jeden numer telefonu, tworzony CREATE TYPE
jest typ tabeli zagnieżdżonej telefon_ntabtyp AS TABLE
OF telefon_objtyp;
telefon_ntabtyp oparty na typie
obiektowym telefon_objtyp
Zagnieżdżanie pośrednie - przykład
14

 Utworzenie tabeli obiektowej ludzie_objtab typu osoba_objtyp :


CREATE TYPE osoba_objtyp AS OBJECT ( CREATE TABLE ludzie_objtab OF
id NUMBER(4),
nazwisko_obj nazwisko_objtyp,
osoba_objtyp (id PRIMARY KEY)
adres_obj adres_objtyp, NESTED TABLE telefony_ntab STORE AS
telefony_ntab telefon_ntabtyp); ntab_telefony_lista ;
 Można wskazywać obiekty
wierszowe w tabeli obiektowej ludzie_objtab z innych tabel.
 Dla przykładu załóżmy, że chcemy utworzyć tabelę projekty_objtab,
zawierającą:
numeryczny identyfikator każdego projektu,
tytuł każdego projektu,
prowadzącego każdego projektu,
opis każdego projektu,
kolekcję w postaci tabeli zagnieżdżonej zawierającą zespół osób realizujących każdy
projekt.
Przykład – pośrednia kolekcja zagnieżdżona
15

 W pierwszej kolejności tworzymy typ obiektowy tabeli zagnieżdżonej


osoba_ref_ntabtyp oparty na typie obiektowym osoba_objtyp:

CREATE TYPE osoba_ref_ntabtyp AS TABLE OF REF osoba_objtyp;

 Następnie tworzymy tabelę obiektową projekty_objtab typu projekt_objtyp:


CREATE TYPE projekty_objtyp AS OBJECT ( Tabela zawiera referencję
id NUMBER(4), obiektową REF do tabeli
tytul VARCHAR2(15), ludzie_objtab w celu wskazania
prowadzacy_ref REF osoba_objtyp, osoby prowadzącej dany projekt
opis CLOB, oraz kolekcję w postaci tabeli
zespol_ntab osoba_ref_ntabtyp); zagnieżdżonej zawierającą
referencje obiektowe REF dla
CREATE TABLE projekty_objtab OF projekty_objtyp ( zespołu osób realizujących projekt.
id PRIMARY KEY)
NESTED TABLE zespol_ntab STORE AS ntab_zespol_lista;
16 Przykłady
1

CREATE TYPE typ1_objtyp AS OBJECT


(id_typ1 NUMBER,
atr1 VARCHAR2(10),
atr2 VARCHAR2(10),
atr3 VARCHAR2(10));

CREATE TABLE tabela1_objtab OF typ1_objtyp;

CREATE TABLE tabela1_objtab OF typ1_objtyp


(PRIMARY KEY (id_typ1));

CREATE TABLE tabela1_objtab OF typ1_objtyp


(PRIMARY KEY (id_typ1))
OBJECT IDENTIFIER IS PRIMARY KEY;

DROP TABLE tabela1_objtab;

DROP TYPE typ1_objtyp;


!!!

DODAWANIE / USUWANIE KLUCZA GŁÓWNEGO

ALTER TABLE nazwa_tabeli


ADD CONSTRAINT nazwa_ograniczenia
PRIMARY KEY (nazwa_kolumny);

ALTER TABLE nazwa_tabeli DISABLE PRIMARY KEY;


2.1

CREATE TYPE typ2_objtyp AS OBJECT


(id_typ2 NUMBER,
atr1 VARCHAR2(10),
atr2 VARCHAR2(10),
atr3 VARCHAR2(10),
Id_typ1_ref REF typ1_objtyp);

CREATE TABLE tabela2_objtab OF typ2_objtyp;

CREATE TABLE tabela2_objtab OF typ2_objtyp


(PRIMARY KEY (id_typ2) ,
FOREIGN KEY (id_typ1_ref) REFERENCES tabela1_objtab);
CREATE TABLE tabela2_objtab OF typ2_objtyp
2.2
(PRIMARY KEY (id_typ2) ,
FOREIGN KEY (id_typ1_ref) REFERENCES tabela1_objtab)
OBJECT IDENTIFIER IS PRIMARY KEY;

DROP TABLE tabela2_objtab;

DROP TYPE typ2_objtyp;


!!!

DODAWANIE / USUWANIE KLUCZA OBCEGO

ALTER TABLE nazwa_tabeli


ADD CONSTRAINT nazwa_ograniczenia
FOREIGN KEY (nazwa_kolumny)
REFERENCING nazwa_tabeli_obcej;

ALTER TABLE nazwa_tabeli DISABLE CONSTRAINT


nazwa_ograniczenia;
3.1

CREATE TYPE typ3_objtyp AS OBJECT


(id_typ3 NUMBER,
atr1 VARCHAR2(10),
atr2 VARCHAR2(10),
atr3 VARCHAR2(10),
id_typ1_ref REF typ1_objtyp,
id_typ2_ref REF typ2_objtyp);
3.2
CREATE TABLE tabela3_objtab OF typ3_objtyp;

CREATE TABLE tabela3_objtab OF typ3_objtyp


(PRIMARY KEY (id_typ3) ,
FOREIGN KEY (id_typ1_ref) REFERENCES tabela1_objtab,
FOREIGN KEY (id_typ2_ref) REFERENCES tabela2_objtab);

CREATE TABLE tabela3_objtab OF typ3_objtyp


(PRIMARY KEY (id_typ3) ,
FOREIGN KEY (id_typ1_ref) REFERENCES tabela1_objtab,
FOREIGN KEY (id_typ2_ref) REFERENCES tabela2_objtab)
OBJECT IDENTIFIER IS PRIMARY KEY;

DROP TABLE tabela3_objtab;

DROP TYPE typ3_objtyp;


4.1

CREATE TYPE typ4_objtyp AS OBJECT


(id_typ4 NUMBER,
atr1 VARCHAR2(10),
atr2 VARCHAR2(10));

CREATE TYPE typ4_ntabtyp AS TABLE OF typ4_objtyp;

CREATE TYPE typ5_objtyp AS OBJECT


(id_typ5 NUMBER,
atr1 VARCHAR2(10),
atr2 VARCHAR2(10),
typ4_ntab typ4_ntabtyp);
CREATE TABLE tabela5_objtab OF typ5_objtyp
4.2 NESTED TABLE typ4_ntab STORE AS ntab_typ4
((PRIMARY KEY (NESTED_TABLE_ID, id_typ4))
ORGANIZATION INDEX COMPRESS);

CREATE TABLE tabela5_objtab OF typ5_objtyp


(PRIMARY KEY (id_typ5))
NESTED TABLE typ4_ntab STORE AS ntab_typ4
((PRIMARY KEY (NESTED_TABLE_ID, id_typ4))
ORGANIZATION INDEX COMPRESS);

CREATE TABLE tabela5_objtab OF typ5_objtyp


(PRIMARY KEY (id_typ5))
OBJECT IDENTIFIER IS PRIMARY KEY
NESTED TABLE typ4_ntab STORE AS ntab_typ4
((PRIMARY KEY (NESTED_TABLE_ID, id_typ4))
ORGANIZATION INDEX COMPRESS);

prefiks określający wiersz tabeli macierzystej zapisywany jest w tabeli


zagnieżdżonej tylko raz, dla wszystkich wierszy tabeli zagnieżdżonej, odpowiadających
danemu wierszowi tabeli macierzystej
4.3 DROP TABLE tabela5_objtab;

DROP TYPE typ5_objtyp;

DROP TYPE typ4_ntabtyp;

DROP TYPE typ4_objtyp;


5.1

CREATE TYPE typ6_objtyp AS OBJECT


(id_typ6 NUMBER,
atr1 VARCHAR2(10),
atr2 VARCHAR2(10));

CREATE TYPE typ6_ntabtyp AS TABLE OF typ6_objtyp;

CREATE TYPE typ7_objtyp AS OBJECT


(id_typ7 NUMBER,
atr1 VARCHAR2(10),
atr2 VARCHAR2(10),
typ6_ntab typ6_ntabtyp);
CREATE TYPE typ7_ntabtyp AS TABLE OF typ7_objtyp;
5.2
CREATE TYPE typ8_objtyp AS OBJECT
(id_typ8 NUMBER,
atr1 VARCHAR2(10),
atr2 VARCHAR2(10),
typ7_ntab typ7_ntabtyp);

CREATE TABLE tabela8_objtab OF typ8_objtyp


(PRIMARY KEY (id_typ8))
OBJECT IDENTIFIER IS PRIMARY KEY
NESTED TABLE typ7_ntab STORE AS ntab_typ7
((PRIMARY KEY (NESTED_TABLE_ID, id_typ7))
ORGANIZATION INDEX COMPRESS
NESTED TABLE typ6_ntab STORE AS ntab_typ6
((PRIMARY KEY (NESTED_TABLE_ID, id_typ6))
ORGANIZATION INDEX COMPRESS));
5.3 DROP TABLE tabela8_objtab;

DROP TYPE typ8_objtyp;

DROP TYPE typ7_ntabtyp;

DROP TYPE typ7_objtyp;

DROP TYPE typ6_ntabtyp;

DROP TYPE typ6_objtyp;


6.1

CREATE TYPE typ9_objtyp AS OBJECT


(id_typ9 NUMBER,
atr1 VARCHAR2(10),
atr2 VARCHAR2(10));

CREATE TYPE typ9_ntabtyp AS TABLE OF typ9_objtyp;


CREATE TYPE typ10_objtyp AS OBJECT
6.2 (id_typ10 NUMBER,
atr1 VARCHAR2(10),
atr2 VARCHAR2(10));

CREATE TYPE typ10_ntabtyp AS TABLE OF typ10_objtyp;

CREATE TYPE typ11_objtyp AS OBJECT


(id_typ11 NUMBER,
atr1 VARCHAR2(10),
atr2 VARCHAR2(10),
typ9_ntab typ9_ntabtyp,
typ10_ntab typ10_ntabtyp);

CREATE TABLE tabela11_objtab OF typ11_objtyp


(PRIMARY KEY (id_typ11))
OBJECT IDENTIFIER IS PRIMARY KEY
NESTED TABLE typ9_ntab STORE AS ntab_typ9
((PRIMARY KEY (NESTED_TABLE_ID, id_typ9))
ORGANIZATION INDEX COMPRESS)
NESTED TABLE typ10_ntab STORE AS ntab_typ10
((PRIMARY KEY (NESTED_TABLE_ID, id_typ10))
ORGANIZATION INDEX COMPRESS);
6.3 DROP TABLE tabela11_objtab;

DROP TYPE typ11_objtyp;

DROP TYPE typ10_ntabtyp;

DROP TYPE typ10_objtyp;

DROP TYPE typ9_ntabtyp;

DROP TYPE typ9_objtyp;


33 … na kolejnych wykładach:
… operacje obiektowe, metody obiektowe,
widoki obiektowe
Literatura
34

 [AJS2012] Antywzorce języka SQL. Bill Karwin, Helion 2012.


 [DBORDG] Database Object-Relational Developer's Guide, Oracle®
Database, 12c Release 1,
https://docs.oracle.com/database/121/ADOBJ/toc.htm
 [DBSQLR] Database SQL Language Reference, Oracle® Database,
12c Release 1,
https://docs.oracle.com/database/121/SQLRF/toc.htm
 [WSPBD2005] Współczesne problemy systemów baz danych Cz. 1.”
red. Włodzimierz Stanisławski, Skrypty Politechniki Opolskiej ; nr
27. , 2005. - 210 s..

You might also like