Databáze I Přednáška 7
Objektové rozšíření SQL Objektově relační databáze SQL:1999 objektové rozšíření SQL vztahuje se k objektově relačním databázovým systémům ukládají objekty do relační databáze umožňují integraci klasických tabulkových dat a složitých objektů (multimédia, časové řady, prostorová data, )
Nové datové typy v SQL:1999 uživatelské datové typy (abstraktní datové typy), typ řádku konstruktory pro typy řádků a typy odkazů typ kolekce ARRAY uživatelem definované funkce a procedury velké objekty (large object) textové a binární zadává se velikost v KB, MB, GB
Nové datové typy v SQL:1999 typ BOOLEAN ve tří-hodnotové logice TRUE, FALSE, UNKNOWN Poznámka: velké objekty nelze porovnávat a atributy těchto typů nemohou být cizími klíči
Nové datové typy v SQL:1999 BLOB Binary Large Object datový typ pro uložení binárních dat (např. multimédia) CLOB Character Large Object datový typ pro uložení textových dat (rozsáhlé texty, např. články) některé SŘBD měly možnost i dříve definovat sloupec tabulky jako TEXT nebo MEMO, ale bez další podpory
ORSŘBD (objektově relační SŘBD) obsahují zásuvné (plug-in) softwarové moduly pro práci s daty ve sloupcích typu velké objekty, tzv. extendery IBM DB 2 Universal Database: rok 2007 14 extenderů: obrázky, videa, texty, časové řady, mapy, Informix: rok 1997 29 extenderů: fuzzy logika, datamaining (čistění dat) Oracle: tzv. cartridge: vyhledávání v obrázcích, časové řady, prostorové objekty
Příklad textový extender umožňuje klást dotazy nad texty rozšiřuje SQL o nové funkce pro práci s texty příklad tabulky: recenze(casopis, autor_rec, nazev_rec, text_rec, datum) text_rec je typu CLOB(15M)
najdi časopis a název recenze, kde se v textu recenze vyskytují slova komedie a Burian nebo Plachta, ale ne Marvan SELECT casopis, nazev_rec FROM recenze WHERE CONTAINS(text_rec, 'komedie' AND ('Burian' OR 'Plachta') AND NOT 'Marvan')=1;
najdi časopis a název recenze, kde se v textu recenze vyskytují slovo Marvan více než čtyřikrát SELECT casopis, nazev_rec FROM recenze WHERE NO_OF_MATCHES(text_rec, 'Marvan') > 4;
Příklad definice tabulky filmy, ve které je uložen i scénář filmu a vlastní video CREATE TABLE filmy ( jmeno_f VARCHAR(20) NOT NULL, rok INT, scenar CLOB(15M), video BLOB(2G), PRIMARY KEY(jmeno_f) );
Atribut typu ARRAY (pole) jde o kolekci dat pole je proměnné délky, definuje se jeho maximální délka umožňuje uložit do jednoho políčka kolekci hodnot příklad: definujme tabulku žáků s informací, kolik hodin každý den cvičí na hudební nástroj
Atribut typu ARRAY CREATE TABLE zaci ( id INT NOT NULL, jmeno VARCHAR(20), prijmeni VARCHAR(30) NOT NULL, cvici DECIMAL(2,0) ARRAY[7] ); ALTER TABLE zaci ADD CONSTRAINT zaci_pk PRIMARY KEY (id);
Nepojmenovaný typ řádku klíčové slovo ROW umožňuje strukturovat řádky tabulek definovat sloupec tabulky jako strukturu bez pojmenování typu, tj. obsahem sloupce je zahnízděný řádek relace obsahující atributy typu kolekce nebo nepojmenované řádky nejsou v 1.NF
Nepojmenovaný typ řádku CREATE TABLE osoby ( rc CHAR(10) NOT NULL, jmeno ROW ( krestni VARCHAR(20), prijmeni VARCHAR(30) NOT NULL), adresa ROW ( ulice VARCHAR(20), číslo INT, psc CHAR(5), město VARCHAR(30) ), PRIMARY KEY (rc) );
Vložení dat do tabulky INSERT INTO osoby VALUES ( '705024568', ('Jan','Novák'), ('Dejvická',1,'16000','Praha 6') );
přístup k datům přes tečkovou notaci SELECT O.jmeno.prijmeni FROM OSOBY O; Poznámka: srovnejte výběr tabulky FROM OSOBY O s jazykem OQL
Abstraktní datové typy abstraktní datový typ - ADT používá v informatice a programování ještě před začleněním do objektových a objektově relačních databází ADT množina dat a operací nad daty definovaná formálně výhodně se implementuje objektově příklady fronta s operacemi vloz_na_konec, vyber_z_cela zásobník s operacemi push, pop strom
Abstraktní datové typy v databázích a v SQL ADT v databázích je n-tice atributů a seznam operací (metod) nad nimi ADT se definuj příkazem CREATE TYPE těla metod (kódy) jsou definovány samostatně, mimo příkaz CREATE TYPE, pomocí CREATE PROCEDURE/FUNCTION event. METHOD
Příklad CREATE TYPE adresa_t AS ( ulice VARCHAR(20), cislo INT, psc CHAR(5), město VARCHAR(30) );
Příklad CREATE TYPE zamestnanec_t AS ( id INT NOT NULL UNIQUE, rc CHAR(10) UNIQUE, jmeno VARCHAR(20), prijmeni VARCHAR(30), adresa adresa_t, vedouci zamestnanec_t, datum_nastupu DATE, plat DECIMAL(7,2)), INSTANTIABLE NOT FINAL, REF(id), METHOD odpracovana_leta(p zamestnanec_t) RETURNS INT; METHOD mzda(p zamestnanec_t) RETURNS DECIMAL;
REF jakýkoliv odkaz na instance tohoto typu bude odvozen od hodnoty atributu id INSTANTIABLE lze vytvářet instance tohoto typy opak: UNINSTANTIABLE vhodné, chceme-li vytvářet instance až od potomků definovaného typu NOT FINAL je dovoleno definovat podtypy (potomky) opak: FINAL
Definice podtypů pomocí klíčového slova UNDER je dovoleno pouze jednonásobné dědění podtyp nemůže dědit od více nadtypů tam, kde může být instance nadtypu (parametry), lze použít instanci podtypu CREATE TYPE urednik_t UNDER zamestnanec_t AS ( definice dalších atributů ) definice dalších metod;
Vytvoření instancí od ADT konstruktorem příkazem INSERT do tabulky pouze instance uložená v tabulce je perzistentní (trvalá) operátorem NEW např. chceme-li porovnávat instanci za klíčovým slovem WHERE s konstantou, i tato musí být vytvořena jako objekt pomocí NEW (není trvalý) př: vedouci je typu zamestnanec_t v dotazu: WHERE vedouci = NEW 1234,"7012051234",
Volání metod tečkovou notací X.odpracovana_leta() instance jako první parametr odpracovana_leta(x)
Definice podtabulek odvozenou tabulku lze definovat i bez explicitní definice typů, přímým odvozením od jiné tabulky CREATE TABLE osoby ( rc CHAR(10) NOT NULL, prijmeni VARCHAR(20) ); CREATE TABLE zamestnanci UNDER osoby ( mzda DECIMAL(7,2));
Definice procedur, funkcí (metod) procedury a funkce mohou být napsány v SQL PSM i v jiných jazycích (Java, C/C++) SQL PSM Persistent Store Modules rozšíření SQL na výpočetní úplnost definice CREATE FUNCTION/PROCEDURE v některých SŘBD CREATE METHOD
Definice procedury tabulka ucty(cislo,zustatek) procedura vrátí zůstatek na účtu do parametru zu CREATE PROCEDURE vrat_zustatek (IN c_uctu INTEGER, OUT zust DOUBLE PRECISION) BEGIN SELECT zustatek INTO zust FROM ucty WHERE cislo = c_uctu; IF zustatek < 2500 THEN SIGNAL nizky_zustatek END IF END
Definice funkce CREATE FUNCTION vrat_zustatek (IN c_uctu INTEGER) RETURNS DOUBLE PRECISION BEGIN DECLARE zust DOUBLE PRECISION; SELECT zustatek INTO zust FROM ucty WHERE cislo = c_uctu; IF zustatek < 2500 THEN SIGNAL nizky_zustatek END IF; RETURN zust END
Poznámky: procedury a funkce se volají příkazem CALL příkaz SIGNAL vyvolá speciální handler
Pojmenovaný typ řádku uživatelem definovaný pojmenovaný typ, který není na rozdíl od ADT zapouzdřený tj. nelze definovat metody
Pojmenovaný typ řádku CREATE ROW TYPE zamestnanec_t ( id INT NOT NULL UNIQUE, rc CHAR(10) UNIQUE, jmeno VARCHAR(20), prijmeni VARCHAR(30), adresa adresa_t, vedouci zamestnanec_t, datum_nastupu DATE, plat DECIMAL(7,2) );
vytvoření tabulky pomocí tohoto typu CREATE TABLE zamestnanci OF zamestnanec_t (PRIMARY KEY id); protože typ zamestnanec_t je definován jako ROW, tabulka se skládá z "obyčejných" řádků (jako v původním SQL)
pokud by byl typ zamestnanec_t definován jako ADT na snímku 20, tabulku bychom vytvořili stejně, CREATE TABLE zamestnanci OF zamestnanec_t (PRIMARY KEY id); ale řádky tabulky by měly jednoznačnou identitu pomocí OID jako v OOSŘBD na objekty se lze odkazovat jen pomocí reference REF
Typ odkazu odkaz se deklaruje klíčovým slovem REF typ odkazu na instanci může být uživatelsky definovaný REF USING integer; pomocí jednoznačného atributu REF(id) odpovídá cizímu klíči tato varianta je použita na snímcích 20,21 generován systémem REF IS SYSTEM GENERATED např. automaticky pomocí OID obecně může odkaz ukazovat do jakékoliv tabulky, která obsahuje instance ADT
Odkaz jako atribut CREATE ROW TYPE ucet_t ( c_uctu INT, rc CHAR(10) UNIQUE, klient REF(zakaznik_t), typ_uctu CHAR(1), zalozen DATE, zůstatek DOUBLE PRECISION ); realizace odkazu na instanci zákazníka záleží, jaký typ odkazu dle předchozího snímku je v definici typu zákazník CREATE TABLE ucty of ucet_t
Odkaz jako atribut CREATE TABLE ucty OF ucet_t ( PRIMARY KEY c_uctu, SCOPE FOR klient IS zakaznici } omezení SCOPE znamená, že ve sloupci klient musí být odkazy na instance, které jsou v tabulce zakaznici
Ukázka dotazu "dereference" se provádí pomocí operátoru -> jako v C/C++ lze se pohybovat "mezi" tabulkami jako v OQL najdi jména klientů, kteří jsou z Prahy a mají na účtu více jak 100 tis. SELECT U.klient->jmeno FROM ucty U WHERE U.klient->adresa.mesto = 'Praha' AND U.zustatek>100000;
Nové kolekce v SQL:2003 SQL:1999 - pouze ARRAY SQL:2003 SET množina LIST seznam MULTISET multimnožina lze definovat kolekci referencí příklad: seznam udělených prémií zaměstnanci můžeme definovat jako premie LIST(DECIMAL(7,2))
Speciální kolekce v SŘBD ORACLE hnízděná tabulka (nested table) realizuje neohraničenou, neuspořádanou kolekci CREATE ROW TYPE ucet_t ( cislo INT, otevren DATE, zustatek DOUBLE PRECISION ); CREATE TYPE ucty_t AS TABLE OF ucet_t;
Speciální kolekce v SŘBD ORACLE vytvoříme tabulku zaměstnanci, která bude mít atribut ucty typu hnízděná tabulka ucty_t CREATE TABLE zamestnanci ( id INT, ucty ucty_t, );
Modelování vztahů pomocí ORDBS klasické SQL:92 tabulky provázané cizími klíči SQL:1999 a SQL:2003 lze využít zahnízděných řádků nebo objektů přímo do tabulky vztahy lze realizovat jako kolekce odkazů REF jako v OO přístupu vztahy M:N také obdobně jako v relačním modelu, kde vytvoříme samostatnou tabulku např.s referencemi na objekty entitních typů
Modelování vztahů pomocí ORDBS ZAKAZNIK (0,n) (1,1) MÁ UCET
Modelování vztahů pomocí ORDBS klasický relační model RC v tabulce UCTY je cizí klíč odkazující do tabulky ZAKAZNICI RC ZAKAZNICI UCTY CISLO RC
Modelování vztahů pomocí ORDBS hnízděná tabulka ucty s účty zákazníka ZAKAZNICI RC ucty
Modelování vztahů pomocí ORDBS hnízděná kolekce s odkazy (REF) do tabulky s objekty ucty ZAKAZNICI RC ucty CISLO UCTY