6 b Basi di dati Relazionali ad oggetti
6 b –Basi di dati Relazionali ad oggetti : approfondimenti Tipi definiti dall’utente ID di Oggetti Tabelle innestate Basi di dati II J. Ullman -ORDBMS 1
Fondere i modelli relazionale ed a oggetti u. I modelli orientati agli oggetti supportano tipi di dati interessanti – non solo file “piatti” w Mappe, multimedia, etc. u. Il modello relazionale supporta query di alto livello u. I database object-relational sono un tentativo di ottenere il meglio dei due modelli Basi di dati II J. Ullman -ORDBMS 2
Evoluzione dei DBMS u. I database orientati agli oggetti non hanno avuto successo perché non hanno offerto l’efficienza dei collaudati DBMS relazionali u. 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 3
Caratteristiche di SQL: 1999 e Oracle u. SQL: 1999 include molte delle caratteristiche object-relational che verranno descritte u. Però, essendo molto recente, diversi DBMS usano approcci ancora differenti w Verranno mostrate a volte le caratteristiche e la sintassi di Oracle Basi di dati II J. Ullman -ORDBMS 4
Tipi definiti dall’utente (UDT) u Un tipo definito dall’utente, or UDT, è essenzialmente una definizione di classe, con una struttura e dei metodi. u 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 5
Definizione di UDT CREATE TYPE <nometipo> AS ( <lista of elementi, come in CREATE TABLE> ); u 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 6
Esempio: definizione di UDT CREATE TYPE Bar. Type AS ( name CHAR(20), addr CHAR(20) ); CREATE TYPE Beer. Type AS ( name CHAR(20), manf CHAR(20) ); Basi di dati II J. Ullman -ORDBMS 7
Riferimenti u. Se. T è un tipo, allora REF T è il tipo di un riferimento to T, cioè, un “puntatore” ad un oggetto di tipo T. u. Viene spesso chiamato nei sistemi Object Oriented un “ID di oggetto, OID”. u. A differenza degli OID, un REF è visibile, anche se normalmente non ha significato Basi di dati II J. Ullman -ORDBMS 8
Esempio: REF CREATE TYPE Menu. Type AS ( bar REF Bar. Type, beer REF Beer. Type, price FLOAT ); u Gli oggetti Menu. Type hanno il seguente aspetto: 3. 00 Ad un oggetto Bar. Type Basi di dati II Ad un oggetto Beer. Type J. Ullman -ORDBMS 9
UDT come tipi riga u. Una tabella può essere definita con uno schema che è un tipo riga, invece di elencare i suoi elementi u. Sintassi: CREATE TABLE <nome tabella> OF <nome tipo>; Basi di dati II J. Ullman -ORDBMS 10
Esempio: Creare una relazione CREATE TABLE Bars OF Bar. Type; CREATE TABLE Beers OF Beer. Type; CREATE TABLE Sells OF Menu. Type; Basi di dati II J. Ullman -ORDBMS 11
Valori di relazioni di tipo riga u. Tecnicamente, una relazione come Bars, dichiarata con il tipo riga Bar. Type, non è un insieme di coppie - è una relazione unaria , le cui tuple sono oggetti con due componenti: name and addr. u. Ogni UDT ha un costruttore di tipo con lo stesso nome, che racchiude oggetti di quel tipo. Basi di dati II J. Ullman -ORDBMS 12
Esempio: Costruttore di tipo u. La query SELECT * FROM Bars; u. Produce “tuples” come: Bar. Type(’Joe’’s Bar’, ’Maple St. ’) Basi di dati II J. Ullman -ORDBMS 13
Accedere ai valori di un tipo riga u. In Oracle, il punto funziona come di consueto. w Ma è necessario, quando vengono impiegate caratteristiche Object Relational, usare un alias per ogni relazione. w Esempio: SELECT bb. name, bb. addr FROM Bars bb; Basi di dati II J. Ullman -ORDBMS 14
Accedere ai valori: approccio SQL: 1999 u. 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. w L’accessore per A non ha argomenti, come A(). w Il trasformatore per A prende il nuovo valore come argomento, come in A(v). Basi di dati II J. Ullman -ORDBMS 15
Esempio: accesso ai valori in SQL: 1999 u. La stessa query in SQL: 1999 è SELECT bb. name(), bb. addr() FROM Bars bb; Basi di dati II J. Ullman -ORDBMS 16
Metodi costruttori in SQL: 1999 u. Ogni UDT ha almeno un metodo costruttore, ovvero un metodo che ha lo stesso nome del UDT e ritorna un oggetto dello stesso tipo w Esempio Bar. Type() Basi di dati II J. Ullman -ORDBMS 17
Inserire valori di tipo riga u. In Oracle, possiamo usare il comando standard INSERT, ricordando che una relazione di tipo riga è in realtà unaria e richiede quel costruttore di tipo. u. Esempio: INSERT INTO Bars VALUES( Bar. Type(’Joe’’s Bar’, ’Maple St. ’) ); Basi di dati II J. Ullman -ORDBMS 18
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 19
Esempio: INSERT IN SQL: 1999 u. Il codice seguente deve essere parte di una procedura , ad esempio PSM, nel quale abbiamo una variabile new. Bar. I metodi modificatori cambiano SET new. Bar = Bar. Type(); i componenti name and addr new. Bar. name(’Joe’’s Bar’); di new. Bar. addr(’Maple St. ’); INSERT INTO Bars VALUES(new. Bar); Basi di dati II J. Ullman -ORDBMS 20
UDT come tipi colonna u. Un UDT può essere il tipo di un attributo. u. 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 21
Esempio: tipo colonna CREATE TYPE Addr. Type AS ( street CHAR(30), city CHAR(20), zip INT ); CREATE TABLE Drinkers ( name CHAR(30), addr Addr. Type, fav. Beer. Type ); Basi di dati II J. Ullman -ORDBMS I valori dei componenti addr e fav. Beer sono oggetti con 3 e 2 campi, rispettivamente. 22
Problema Oracle con l’accesso ai campi u. Si può accedere ad un campo C di un oggetto che è il valore di un attributo A by A. C. u. 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 23
Esempio: accesso ai campi in Oracle u. Sbagliato: SELECT fav. Beer. name FROM Drinkers; u. Sbagliato: SELECT Drinkers. fav. Beer. name FROM Drinkers; u. Corretto: SELECT dd. fav. Beer. name FROM Drinkers dd; Basi di dati II J. Ullman -ORDBMS 24
Seguire i REF u A -> B ha senso se: 1. A è di tipo REF T. 2. B è un attributo (componente) di oggetti di tipo T. u Denota il valore del componente B dell’oggetto puntato da A. Basi di dati II J. Ullman -ORDBMS 25
Esempio: Seguire i REF u. Ricorda: Sells è una relazione con riga Menu. Type(bar, beer, price), dove bar and beer sono REF a oggetti di tipo Bar. Type and Beer. Type. u. Trova le birre servite da Joe: Poi usa la freccia Per ottenere il nome SELECT ss. beer()->name del bar e della birra referenziati FROM Sells ss WHERE ss. bar()->name = ’Joe’’s Bar’; Prima, i metodi generatori per-ORDBMS Basi di datiusa II J. Ullman accedere alle componenti bar and beer 26
Seguire i REF: Stile Oracle u. Seguire i REF è implicito nel punto. u. Basta far seguire un REF da un punto e un campo dell’oggetto riferito. u. Esempio: SELECT ss. beer. name FROM Sells ss WHERE ss. bar. name = ’Joe’’s Bar’; Basi di dati II J. Ullman -ORDBMS 27
Operatore DEREF di Oracle Motivazione u. Se vogliamo l’insieme degli oggetti birra per le birre vendute da Joe, possiamo provare: SELECT ss. beer FROM Sells ss WHERE ss. bar. name = ‘Joe’’s Bar’; u. Legale, ma ss. beer è un REF, quindi senza significato. Basi di dati II J. Ullman -ORDBMS 28
Uso di DEREF in Oracle u. Per vedere gli oggetti Beer. Type, si usi: SELECT DEREF(ss. beer) FROM Sells ss WHERE ss. bar. name = ’Joe’’s Bar’; uche produce valori tipo: Beer. Type(’Bud’, ’Anheuser-Busch’) Basi di dati II J. Ullman -ORDBMS 29
Metodi --- Sintassi Oracle u. Le classi non hanno solo la struttura; possono avere anche metodi. u. Studieremo la sintassi di Oracle. Si dichiarano in CREATE TYPE, e si definiscono con il comando CREATE TYPE BODY. w Useremo la sintassi PL/SQL per i metodi. w La variabile SELF si riferisce all’ oggetto al quale il metodo è applicato. Basi di dati II J. Ullman -ORDBMS 30
Esempio: dichiarazione di metodo u. Si aggiunga il metodo price. In. Yen a Menu. Type. CREATE TYPE Menu. Type AS OBJECT ( bar REF Bar. Type, Il nome dei Metodi beer REF Beer. Type, in Oracle. price FLOAT, MEMBER FUNCTION price. In. Yen(rate IN FLOAT) RETURN FLOAT, PRAGMA RESTRICT_REFERENCES(price. In. Yen, WNDS) ); “Write no database state. ” / Cioè, qualunque cosa price. In. Yen faccia non modificherà il database. Basi di dati II J. Ullman -ORDBMS 31
Definizione di Metodi –Stile di Oracle u. 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 32
Esempio: Definizione di Metodi Non c’è il modo (IN) nel body, solo nella dichiarazione CREATE TYPE BODY Menu. Type AS MEMBER FUNCTION price. In. Yen(rate FLOAT) RETURN FLOAT IS BEGIN RETURN rate * SELF. price; END; Usa le parentesi solo quando c’è almeno / un argomento. Basi di dati II J. Ullman -ORDBMS 33
Uso di un metodo u. Far seguire il nome di un oggetto da un punto e il nome del metodo, con gli argomenti , se ce ne sono. u. Esempio: SELECT ss. beer. name, ss. price. In. Yen(120. 0) FROM Sells ss WHERE ss. bar. name = ’Joe’’s Bar’; Basi di dati II J. Ullman -ORDBMS 34
Metodi di ordinamento : SQL: 1999 u. Ogni UDT T può definire due metodi chiamati EQUAL and LESSTHAN. w Ognuno prende un argomento di tipo T ed è applicato ad un altro oggetto di tipo T. w Ritorna TRUE se e solo se l’oggetto target è = (risp. <) all’oggetto argomento. u. 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 35
Metodi di ordinamento : Oracle u. Ogni metodo per un UDT può essere dichiarato come un metodo di ordinamento u. 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 36
Esempio: dichiarazione di un metodo di ordinamento. u. Ordina gli oggetti Bar. Type per nome: CREATE TYPE Bar. Type AS OBJECT ( name CHAR(20), addr CHAR(20), ORDER MEMBER FUNCTION before( bar 2 IN Bar. Type) RETURN INT, PRAGMA RESTRICT_REFERENCES(before, WNDS, RNDS, WNPS, RNPS) ); Read/write no database state/package state. Un / Basi di dati II “package” è una collezione of procedure and variabili J. Ullman -ORDBMS Che possono comunicarsi valori tra di loro. 37
Esempio: definizione di un metodo di ordinamento CREATE TYPE BODY Bar. Type AS ORDER MEMBER FUNCTION before(bar 2 Bar. Type) RETURN INT IS BEGIN IF SELF. name < bar 2. name THEN RETURN – 1; ELSIF SELF. name = bar 2. name THEN RETURN 0; ELSE RETURN 1; END IF; END; / Basi di dati II J. Ullman -ORDBMS 38
Tabelle innestate in ORACLE u. Il valore di un componente di una tupla può essere un’intera relazione. u. Se. T 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 39
Esempio: tipo tabella innestata CREATE TYPE Beer. Type AS OBJECT ( name CHAR(20), kind CHAR(10), color CHAR(10) ); / CREATE TYPE Beer. Table. Type AS TABLE OF Beer. Type; / Basi di dati II J. Ullman -ORDBMS 40
Esempio --- Continua u. Usa Beer. Table. Type 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 beer. Table. Type ); Basi di dati II J. Ullman -ORDBMS 41
Memorizzare relazioni innestate u. Oracle non memorizza ciascuna relazione innestata come una relazione separata --- fa solo apparire di farlo. u. Piuttosto, c’è una relazione R in cui tutte le tuple delle tabelle innestate per un attributo A sono memorizzate. u. Dichiarata nella CREATE TABLE con: NESTED TABLE A STORE AS R Basi di dati II J. Ullman -ORDBMS 42
Esempio: memorizzazione di tabelle innestate CREATE TABLE Manfs ( name CHAR(30), addr CHAR(50), beers beer. Table. Type ) NESTED TABLE beers STORE AS Beer. Table; Basi di dati II Si noti dove il punto e virgola va e dove non va. J. Ullman -ORDBMS 43
Interrogare una tabella innestata u Possiamo stampare il valore di una tabella innestata come ogni altro valore. u 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 44
Esempio: interrogare una tabella innestata u. Trova le birre prodotte da Anheuser-Busch: SELECT beers FROM Manfs WHERE name = ’Anheuser-Busch’; u. Produce un valore come: Beer. Table. Type( Beer. Type(’Bud’, ’lager’, ’yellow’), Beertype(’Lite’, ’malt’, ’pale’), … ) Basi di dati II J. Ullman -ORDBMS 45
Interrogazioni con una tabella innestata u. Una tabella innestata può essere convertita in una relazione ordinaria applicando THE(…). u. Questa relazione può essere usata nelle clausole FROM come ogni altra relazione. Basi di dati II J. Ullman -ORDBMS 46
Esempio: Uso di THE u. Trova le ale prodotte da Anheuser-Busch: SELECT bb. name The one nested table for the FROM THE( Anheuser-Busch beers SELECT beers FROM Manfs WHERE name = ’Anheuser-Busch’ ) bb Un alias per la tabella in. WHERE bb. kind = ’ale’; nestata, che non ha nome Basi di dati II J. Ullman -ORDBMS 47
Trasformare relazioni in tabelle innestate u. Ogni relazione con il giusto numero e tipo di attributi può diventare il valore di una tabella innestata. u. 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 48
Esempio: CAST --- 1 u. Si supponga di avere una relazione Beers(beer, manf), dove beer è un oggetto Beer. Type e manf una stringa -- il produttore della birra. u. 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 49
Esempio: CAST --- 2 INSERT INTO Manfs VALUES ( ’Pete’’s’, ’Palo Alto’, L’insieme di oggetti Beer. Type per Pete’s CAST( MULTISET( SELECT bb. beer FROM Beers bb WHERE bb. manf = ’Pete’’s’ ) AS Beer. Table. Type ) Trasforma l’insieme di oggetti ); In una relazione innestata Basi di dati II J. Ullman -ORDBMS 50
- Slides: 50