6b –Basi di dati Relazionali ad oggetti : approfondimenti
description
Transcript of 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
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
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
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
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.
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.
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)
);
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
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
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>;
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;
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.
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.’)
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;
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).
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;
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()
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.’)
);
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.
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
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.
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.
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.
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;
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.
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
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’;
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.
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’)
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.
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.
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;/
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.
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’;
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).
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.
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.
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;/
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 ;
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;/
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
);
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
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.
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.
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’),…
)
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.
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
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.
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.
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