6b –Basi di dati Relazionali ad oggetti : approfondimenti

50
Basi di dati II J. Ullman -ORDBMS 1 6b –Basi di dati Relazionali ad oggetti : approfondimenti Tipi definiti dall’utente ID di Oggetti Tabelle innestate

description

6b –Basi di dati Relazionali ad oggetti : approfondimenti. Tipi definiti dall’utente ID di Oggetti Tabelle innestate. Fondere i modelli relazionale ed a oggetti. I modelli orientati agli oggetti supportano tipi di dati interessanti – non solo file “piatti” Mappe, multimedia, etc. - PowerPoint PPT Presentation

Transcript of 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Page 1: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 1

6b –Basi di dati Relazionali ad oggetti :

approfondimentiTipi definiti dall’utente

ID di OggettiTabelle innestate

Page 2: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 2

Fondere i modelli relazionale ed a oggetti

I modelli orientati agli oggetti supportano tipi di dati interessanti – non solo file “piatti” Mappe, multimedia, etc.

Il modello relazionale supporta query di alto livello

I database object-relational sono un tentativo di ottenere il meglio dei due modelli

Page 3: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 3

Evoluzione dei DBMS I database orientati agli oggetti non

hanno avuto successo perché non hanno offerto l’efficienza dei collaudati DBMS relazionali

Le estensioni object-relational ai DBMS relazionali catturano molti dei vantaggi dell’ “Object Orientation” mantenendo la relazione come astrazione fondamentale

Page 4: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 4

Caratteristiche di SQL:1999 e Oracle

SQL:1999 include molte delle caratteristiche object-relational che verranno descritte

Però, essendo molto recente, diversi DBMS usano approcci ancora differenti Verranno mostrate a volte le

caratteristiche e la sintassi di Oracle

Page 5: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 5

Tipi definiti dall’utente (UDT)

Un tipo definito dall’utente, or UDT, è essenzialmente una definizione di classe, con una struttura e dei metodi.

Due usi:1. Come un tipo riga, cioè, il tipo di una

relazione.2. Come il tipo di un attributo di una

relazione.

Page 6: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 6

Definizione di UDT

CREATE TYPE <nometipo> AS (<lista of elementi, come in CREATE TABLE>

); Sintassi di Oracle :

1. Aggiungere “OBJECT” come in CREATE … AS OBJECT.

2. Aggiungere / affinché il tipo sia memorizzato.

Page 7: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 7

Esempio: definizione di UDT

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

);CREATE TYPE BeerType AS (

name CHAR(20),manf CHAR(20)

);

Page 8: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 8

Riferimenti

SeT è un tipo, allora REF T è il tipo di un riferimento to T, cioè, un “puntatore” ad un oggetto di tipo T.

Viene spesso chiamato nei sistemi Object Oriented un “ID di oggetto, OID”.

A differenza degli OID, un REF è visibile, anche se normalmente non ha significato

Page 9: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 9

Esempio: REF

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

); Gli oggetti MenuType hanno il seguente

aspetto:3.00

Ad un oggetto BarType

Ad un oggetto BeerType

Page 10: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 10

UDT come tipi riga

Una tabella può essere definita con uno schema che è un tipo riga, invece di elencare i suoi elementi

Sintassi:CREATE TABLE <nome tabella> OF

<nome tipo>;

Page 11: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 11

Esempio: Creare una relazione

CREATE TABLE Bars OF BarType;

CREATE TABLE Beers OF BeerType;

CREATE TABLE Sells OF MenuType;

Page 12: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 12

Valori di relazioni di tipo riga

Tecnicamente, una relazione come Bars, dichiarata con il tipo riga BarType, non è un insieme di coppie - è una relazione unaria , le cui tuple sono oggetti con due componenti: name and addr.

Ogni UDT ha un costruttore di tipo con lo stesso nome, che racchiude oggetti di quel tipo.

Page 13: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 13

Esempio: Costruttore di tipo

La querySELECT * FROM Bars;

Produce “tuples” come:BarType(’Joe’’s Bar’, ’Maple

St.’)

Page 14: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 14

Accedere ai valori di un tipo riga

In Oracle, il punto funziona come di consueto. Ma è necessario, quando vengono

impiegate caratteristiche Object Relational, usare un alias per ogni relazione.

Esempio:

SELECT bb.name, bb.addrFROM Bars bb;

Page 15: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 15

Accedere ai valori: approccio SQL:1999

In SQL:1999, ogni attributo di un UDT ha un metodo accessore - generator (per ottenere il valore) e un metodo trasformatore – mutator (per cambiare il valore) con lo stesso nome dell’attributo. L’accessore per A non ha argomenti, come

A(). Il trasformatore per A prende il nuovo

valore come argomento, come in A(v).

Page 16: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 16

Esempio: accesso ai valori in SQL:1999

La stessa query in SQL:1999 è

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

Page 17: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 17

Metodi costruttori in SQL:1999

Ogni UDT ha almeno un metodo costruttore, ovvero un metodo che ha lo stesso nome del UDT e ritorna un oggetto dello stesso tipo Esempio BarType()

Page 18: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 18

Inserire valori di tipo riga

In Oracle, possiamo usare il comando standard INSERT, ricordando che una relazione di tipo riga è in realtà unaria e richiede quel costruttore di tipo.

Esempio:INSERT INTO Bars VALUES(

BarType(’Joe’’s Bar’, ’Maple St.’)

);

Page 19: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 19

Inserire valori: stile di SQL:1999

1. Creare una nuova variabile X del tipo richiesto, usando il costruttore per quel tipo

2. Usare i metodi trasformatori per gli attributi per impostare i valori dei campi di X.

3. Inserire X nella relazione.

Page 20: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 20

Esempio: INSERT IN SQL:1999

Il codice seguente deve essere parte di una procedura , ad esempio PSM, nel quale abbiamo una variabile newBar.

SET newBar = BarType();newBar.name(’Joe’’s Bar’);newBar.addr(’Maple St.’);INSERT INTO Bars VALUES(newBar);

I metodi modifi-catori cambianoi componentiname and addr di newBar

Page 21: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 21

UDT come tipi colonna

Un UDT può essere il tipo di un attributo.

In un’altra definizione di UDT, o in un comando CREATE TABLE, usa il nome dell’ UDT come tipo dell’ attributo.

Page 22: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 22

Esempio: tipo colonnaCREATE TYPE AddrType AS (

street CHAR(30),city CHAR(20),zip INT

);CREATE TABLE Drinkers (

name CHAR(30),addr AddrType,favBeer BeerType

);

I valori dei componentiaddr e favBeersono oggetti con 3 e2 campi, rispettivamente.

Page 23: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 23

Problema Oracle con l’accesso ai campi

Si può accedere ad un campo C di un oggetto che è il valore di un attributo A by A.C.

Però, si deve usare un alias, diciamo rr, per la relazione R con attributo A, come rr.A.C.

Page 24: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 24

Esempio: accesso ai campi in Oracle

Sbagliato:SELECT favBeer.nameFROM Drinkers;

Sbagliato:SELECT Drinkers.favBeer.nameFROM Drinkers;

Corretto:SELECT dd.favBeer.nameFROM Drinkers dd;

Page 25: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 25

Seguire i REF

A -> B ha senso se:1. A è di tipo REF T.2. B è un attributo (componente) di

oggetti di tipo T. Denota il valore del componente B

dell’oggetto puntato da A.

Page 26: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 26

Esempio: Seguire i REF

Ricorda: Sells è una relazione con riga MenuType(bar, beer, price), dove bar and beer sono REF a oggetti di tipo BarType and BeerType.

Trova le birre servite da Joe:SELECT ss.beer()->nameFROM Sells ssWHERE ss.bar()->name = ’Joe’’s

Bar’;Prima, usa i metodi generatori peraccedere alle componenti bar and beer

Poi usa la frecciaPer ottenere il nomedel bar e della birrareferenziati

Page 27: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 27

Seguire i REF: Stile Oracle

Seguire i REF è implicito nel punto. Basta far seguire un REF da un punto

e un campo dell’oggetto riferito. Esempio:

SELECT ss.beer.nameFROM Sells ssWHERE ss.bar.name = ’Joe’’s

Bar’;

Page 28: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 28

Operatore DEREF di Oracle - Motivazione

Se vogliamo l’insieme degli oggetti birra per le birre vendute da Joe, possiamo provare:

SELECT ss.beerFROM Sells ssWHERE ss.bar.name = ‘Joe’’s Bar’;

Legale, ma ss.beer è un REF, quindi senza significato.

Page 29: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 29

Uso di DEREF in Oracle

Per vedere gli oggetti BeerType, si usi:SELECT DEREF(ss.beer)FROM Sells ssWHERE ss.bar.name = ’Joe’’s Bar’;

che produce valori tipo:BeerType(’Bud’, ’Anheuser-

Busch’)

Page 30: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 30

Metodi --- Sintassi Oracle

Le classi non hanno solo la struttura; possono avere anche metodi.

Studieremo la sintassi di Oracle. Si dichiarano in CREATE TYPE, e si definiscono con il comando CREATE TYPE BODY. Useremo la sintassi PL/SQL per i metodi. La variabile SELF si riferisce all’ oggetto

al quale il metodo è applicato.

Page 31: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 31

Esempio: dichiarazione di metodo

Si aggiunga il metodo priceInYen a MenuType.

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)

);/

Il nome dei Metodiin Oracle.

“Write no database state.”Cioè, qualunque cosa priceInYen faccianon modificherà il database.

Page 32: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 32

Definizione di Metodi –Stile di Oracle

Forma del comando create-body :CREATE TYPE BODY <type name> AS

<definizione dei metodi = definizioni di procedure in PL/SQL , usando

“MEMBER FUNCTION” al posto di“PROCEDURE”>

END;/

Page 33: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 33

Esempio: Definizione di Metodi

CREATE TYPE BODY MenuType ASMEMBER FUNCTION

priceInYen(rate FLOAT) RETURN FLOAT ISBEGIN

RETURN rate * SELF.price;END;

END;/

Non c’è il modo(IN) nel body, solonella dichiarazione

Usa le parentesi soloquando c’è almenoun argomento.

Page 34: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 34

Uso di un metodo

Far seguire il nome di un oggetto da un punto e il nome del metodo,con gli argomenti , se ce ne sono.

Esempio:SELECT ss.beer.name,

ss.priceInYen(120.0)FROM Sells ssWHERE ss.bar.name = ’Joe’’s

Bar’;

Page 35: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 35

Metodi di ordinamento : SQL:1999

Ogni UDT T può definire due metodi chiamati EQUAL and LESSTHAN. Ognuno prende un argomento di tipo T ed è

applicato ad un altro oggetto di tipo T. Ritorna TRUE se e solo se l’oggetto target è =

(risp. <) all’oggetto argomento.

Consente di comparare oggetti di tipo T mediante =, <, etc. nelle clausole WHERE e per l’ordinamento (ORDER BY).

Page 36: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 36

Metodi di ordinamento : Oracle

Ogni metodo per un UDT può essere dichiarato come un metodo di ordinamento

Il metodo di ordinamento restituisce un valore <0, =0, o >0, a seconda che il valore dell’ oggetto SELF is <, =, o > dell’oggetto argomento.

Page 37: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 37

Esempio: dichiarazione di un metodo di ordinamento.

Ordina gli oggetti BarType per nome: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));/ Read/write no database state/package state. Un

“package” è una collezione of procedure and variabiliChe possono comunicarsi valori tra di loro.

Page 38: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 38

Esempio: definizione di un metodo di ordinamento

CREATE TYPE BODY BarType ASORDER MEMBER FUNCTIONbefore(bar2 BarType) RETURN INT ISBEGINIF SELF.name < bar2.name THEN RETURN –1;ELSIF SELF.name = bar2.name THEN RETURN 0;ELSE RETURN 1;END IF;END;

END;/

Page 39: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 39

Tabelle innestate in ORACLE

Il valore di un componente di una tupla può essere un’intera relazione.

SeT is a UDT, possiamo creare un tipo S i cui valori sono relazioni con tipo riga T, per mezzo di:

CREATE TYPE S AS TABLE OF T ;

Page 40: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 40

Esempio: tipo tabella innestata

CREATE TYPE BeerType AS OBJECT (name CHAR(20),kind CHAR(10),colorCHAR(10)

);/CREATE TYPE BeerTableType AS

TABLE OF BeerType;/

Page 41: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 41

Esempio --- Continua

Usa BeerTableType in una relazione Manfs che memorizza l’insieme delle birre prodotte da ciascun produttore in una tupla per quel produttore.

CREATE TABLE Manfs (name CHAR(30),addr CHAR(50),beers beerTableType

);

Page 42: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 42

Memorizzare relazioni innestate

Oracle non memorizza ciascuna relazione innestata come una relazione separata --- fa solo apparire di farlo.

Piuttosto, c’è una relazione R in cui tutte le tuple delle tabelle innestate per un attributo A sono memorizzate.

Dichiarata nella CREATE TABLE con:NESTED TABLE A STORE AS R

Page 43: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 43

Esempio: memorizzazione di tabelle innestate

CREATE TABLE Manfs (name CHAR(30),addr CHAR(50),beers beerTableType

)NESTED TABLE beers STORE AS

BeerTable;Si noti dove il punto e virgolava e dove non va.

Page 44: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 44

Interrogare una tabella innestata

Possiamo stampare il valore di una tabella innestata come ogni altro valore.

Ma questi valori hanno due costruttori di tipo :

1. Per la tabella.2. Per il tipo delle tuple nella tabella.

Page 45: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 45

Esempio: interrogare una tabella innestata

Trova le birre prodotte da Anheuser-Busch:

SELECT beers FROM ManfsWHERE name = ’Anheuser-Busch’;

Produce un valore come:BeerTableType(

BeerType(’Bud’, ’lager’, ’yellow’),Beertype(’Lite’, ’malt’, ’pale’),…

)

Page 46: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 46

Interrogazioni con una tabella innestata

Una tabella innestata può essere convertita in una relazione ordinaria applicando THE(…).

Questa relazione può essere usata nelle clausole FROM come ogni altra relazione.

Page 47: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 47

Esempio: Uso di THE

Trova le ale prodotte da Anheuser-Busch:SELECT bb.nameFROM THE(

SELECT beersFROM ManfsWHERE name = ’Anheuser-Busch’

) bbWHERE bb.kind = ’ale’;

The one nestedtable for theAnheuser-Buschbeers

Un alias per la tabella in-nestata, che non ha nome

Page 48: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 48

Trasformare relazioni in tabelle innestate

Ogni relazione con il giusto numero e tipo di attributi può diventare il valore di una tabella innestata.

Usa CAST(MULTISET(…) AS <tipo> ) nella relazione per trasformarla nel valore con il giusto tipo per una tabella innestata.

Page 49: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 49

Esempio: CAST --- 1

Si supponga di avere una relazione Beers(beer, manf), dove beer è un oggetto BeerType e manf una stringa --- il produttore della birra.

Vogliamo inserire in Manfs una nuova tupla, con Pete’s Brewing Co. come nome and l’insieme di birre che sono quelle in Beers per Pete’s.

Page 50: 6b –Basi di dati Relazionali ad oggetti : approfondimenti

Basi di dati II J. Ullman -ORDBMS 50

Esempio: CAST --- 2

INSERT INTO Manfs VALUES (’Pete’’s’, ’Palo Alto’,CAST(

MULTISET(SELECT bb.beerFROM Beers bbWHERE bb.manf = ’Pete’’s’

) AS BeerTableType)

);

L’insieme di oggetti BeerType per Pete’s

Trasforma l’insieme di oggettiIn una relazione innestata