Sei sulla pagina 1di 19

DBMS orientati agli oggetti Database orientati agli oggetti

Object Description Language Object Query Language Leggere paragrafi 4.1, 4.2, 4.3, 9.1, 9.2 e 9.3 di Garcia-Molina et al.
1

Gruppo di standardizzazione: ODMG = Object Data Management Group. ODL = Object Description Language, come la parte CREATE TABLE di SQL. OQL = Object Query Language, prova ad imitare SQL in un ambito OO.

Architettura - 1
LODMG immagina che i produttori di DBMS-OO implementino un linguaggio OO come C++ con estensioni (OQL) che consentono al programmatore di trasferire dati tra il database e il linguaggio ospite in maniera immediata

Architettura - 2
ODL e usato per definire classi persistenti, quelle i cui oggetti possono essere memorizzati permanentemente nel database
Le classi ODL assomigliano a insiemi Entita con relazioni binarie, piu metodi. Le definizioni ODL di classi sono parte del linguaggio ospite OO ed esteso.
3 4

Panoramica sullODL
La dichiarazione di una classe include:
1. Un nome per la classe 2. Una o piu dichiarazioni opzionali di chiave. 3. La dichiarazione della estensione (extent) = nome per linsieme degli oggetti esistenti della classe. 4. Dichiarazioni di elementi. Un elemento e un attributo, una relazione o un metodo.
5

Definizione di classe
class <nome> { <lista di dichiarazioni di elementi, separate da punto e virgola> }

Dichiarazioni di attributi e relazioni


Gli attributi sono (normalmente) elementi con un tipo che non coinvolge classi. attribute <tipo> <nome>; Le relazioni connettono un oggetto a uno o piu oggetti di una classe. relationship <tipo> <nome> inverse <relazione>;
7

Relazioni inverse
Si supponga che la classe C abbia una relazione R con una classe D. Allora la classe D deve avere una relazione S con la classe C. R ed S devono essere inverse una dellaltra.
Se loggetto d e collegato ad un oggetto c da R, allora c deve essere collegato a d da S.
8

Esempio: attributi e relazioni


class Bar { Il tipo della relazione serves attribute string name; e un insieme di oggetti Beer. attribute string addr; relationship Set<Beer> serves inverse Beer::servedAt; } Loperatore :: collega class Beer { un nome sulla destra al attribute string name; contesto che contiene quel nome, sulla sinistra attribute string manf; relationship Set<Bar> servedAt inverse Bar::serves; }
9

Tipi delle relazioni


Il tipo di una relazione e
1. Una classe, come Bar. In questo caso un oggetto con questa relazione e collegato ad un solo oggetto Bar. 2. Set<Bar>: loggetto e collegato a un insieme di oggetti Bar. 3. Bag<Bar>, List<Bar>, Array<Bar>: loggetto e collegato a un bag, a una lista o a un array di oggetti Bar.
10

Molteplicita delle relazioni


Tutte le relazioni ODL sono binarie. Relazioni molti a molti hanno Set<> come tipo per la relazione e il suo inverso. Relazioni molti a uno hanno Set<> nella relazione dal lato uno e solo la classe nella relazione dal lato molti. Le relazioni uno a uno hanno classi come tipo in entrambe le direzioni.
11

Esempio: molteplicita
class Drinker { relationship Set<Beer> likes inverse Beer::fans; relationship Beer favBeer inverse Beer::superfans; } Molti a molti usa Set<> in entrambe le direzioni. class Beer { relationship Set<Drinker> fans inverse Drinker::likes; relationship Set<Drinker> superfans inverse Drinker::favBeer; } Molti a uno usa Set<>
solo nel lato uno.
12

Un altro esempio di molteplicita moglie e marito sono uno a uno e


inverse luna dellaltra class Drinker { attribute ; relationship Drinker husband inverse wife; relationship Drinker wife inverse husband; relationship Set<Drinker> buddies inverse buddies; }

Gestire relazioni a piu vie


ODL non supporta relazioni a 3 o piu vie. Possiamo simulare relazioni a piu vie attraverso una classe di collegamento, i cui oggetti rappresentano tuple di oggetti che desideriamo collegare attraverso la relazione a piu vie.
14

buddies e molti a molti ed e il suo inverso. Si noti che non e necessario :: se linverso e nella stessa classe. 13

Classi di collegamento
Si supponga di voler collegare le classi X, Y, e Z attraverso una relazione R. Si costruisce una classe C, i cui oggetti rappresentano una tripla di oggetti (x, y, z) dalle classi X, Y e Z, rispettivamente. Abbiamo bisogno di tre relazioni molti a uno da (x, y, z) a ciascuno di x, y e z.
15

Esempio: classe di collegamento


Si supponga di avere classi Bar e Beer e di voler rappresentare il prezzo a cui ogni Bar vende ogni birra.
Una relazione molti a molti tra Bar e Beer non puo avere un attributo prezzo come nel modello E/R.

Una soluzione: si crei una classe Price e una classe di collegamento BBP per rappresentare un bar, una birra e un prezzo collegati. 16

Esempio, continua
Dato che gli oggetti Price sono solo numeri, una soluzione migliore e:
1. Da agli oggetti BBP un attributo price. 2. Usa due relazioni molti a uno tra un oggetto BBP e gli oggetti Bar e Beer che rappresenta.

Esempio, conclusione
Ecco la definizione di BBP: class BBP { attribute price:real; relationship Bar theBar inverse Bar::toBBP; relationship Beer theBeer inverse Beer::toBBP; } Bar e Beer devono essere modificate per includere due relazioni, entrambe chiamate toBBP ed entrambe di tipo Set<BBP>.
17 18

Strutture ed enumerazioni
Gli attributi possono avere una struttura (come in C) o essere una enumerazione. Si dichiarano con attribute [Struct or Enum] <nome della struct o enum> { <dettagli> } <nome dellattributo>; I dettagli sono i tipi e i nomi dei campi per una Struct, una lista di costanti per un Enum.
19

Esempio: Struct ed Enum


Nomi per la struct e class Bar { lenum attribute string name; attribute Struct Addr {string street, string city, int zip} address; attribute Enum Lic { FULL, BEER, NONE } license; relationship Nomi degli attributi }
20

Riuso di Struct ed Enum


Possiamo riferirci al nome di una Struct o di un Enum in unaltra definizione di classe.
Usa loperatore :: per indicare la classe sorgente.

Dichiarazioni dei metodi


Una definizione di classe puo includere dichiarazioni di metodi per la classe. La dichiarazione consiste di:
1. Un tipo di ritorno, se ce ne uno. 2. Il nome del metodo. 3. I modi e i tipi degli argomenti (senza nomi)
I modi sono in, out e inout.

Esampio: Usa la stessa struttura street-city-zip class Drinker { qui. attribute string name; attribute Struct Bar::Addr address;

4. Ogni eccezione che il metodo puo lanciare.

21

22

Esempio: metodi
real mark(in string)raises(noGrades);

Metodi
Il corpo del metodo scritto nel linguaggio object-oriented ospite

1. Il metodo mark restituisce un numero reale (presumibilmente il voto di uno studente). 2. mark prende un argomento, una stringa (presumibilmente il nome dello studente) e non modifica il suo argomento. 3. mark puo lanciare leccezione noGrades.
23

24

Il sistema di tipi ODL


Tipi base: int, real/float, string, tipi enumerativi e classi. Costruttori di tipo:
Struct per le strutture. Tipi collezione: Set, Bag, List, Array e Dictionary ( = funzione da un tipo dominio a un tipo codominio).

Sottoclassi ODL
Sottoclassi OO usuali. Si indica la superclasse con extends e il suo nome. La sottoclasse elenca solo le proprieta; che sono uniche per essa.
Inoltre eredita le proprieta della sua superclasse.
26

I tipi delle relazioni possono essere solo una classe o una collezione singola applicata a una classe.
25

Esempio: sottoclassi
Le Ale sono una sottoclasse di birre: class Ale extends Beer { attribute string color; }

Chiavi ODL
Si possono dichiarare un numero qualunque di chiavi per una classe. Dopo il nome della classe, si aggiunge: (key <lista di chiavi>) Una chiave che consiste di piu di un attributo richiede parentesi addizionali attorno agli attributi.
27 28

Esempio: chiavi
class Beer (key name) { name e la chiave per Beer. class Course (key (dept,number),(room, hours)){ dept e number formano una chiave; lo stesso fanno room e hours.

Estensioni
Per ciascuna classe ce una estensione, linsieme degli oggetti esistenti per quella classe.
Si pensi allestensione come a una relazione con quella classe come schema.

Lestensione si indica dopo il nome della classe, insieme alle chiavi, come in: (extent <nome dellestensione> )
29 30

Esempio: estensione
class Beer (extent Beers key name) { } Per convenzione usiamo il singolare per i nomi delle classi e il plurale per le corrispondenti estensioni.

OQL
OQL e lo standard per le query orientate agli oggetti. Usa ODL come linguaggio di definizione dello schema. I tipi in OQL sono come quelli di ODL. Set(Struct) e Bag(Struct) giocano il ruolo delle relazioni.
32

31

Espressioni cammino
Sia x un oggeto di una classe C.
1. Se a e un attributo di C, allora x.a e il valore di quellattributo. 2. Se r e una relazione di C, allora x.r e il valore al quale x e collegato da r.
Potrebbe essere un oggetto o un insieme di oggetti, a seconda del tipo di r.

Esempio generale
class Sell (extent Sells) { attribute real price; relationship Bar bar inverse Bar::beersSold; relationship Beer beer inverse Beers::soldBy; } class Bar (extent Bars) { attribute string name; attribute string addr; relationship Set<Sell> beersSold inverse Sell::bar; }
33 34

3. Se m e un metodo di C, allora x.m () e il risultato dellapplicazione di m a x.

Esempio generale, conclusione


class Beer (extent Beers) { attribute string name; attribute string manf; relationship Set<Sell> soldBy inverse Sell::beer; }

Esempio: espressioni cammino


Sia s una variabile di tipo Sell, cioe un oggetto bar-beer-price.
1. s.price = il valore dellattributo price delloggetto s. 2. s.bar.addr = lindirizzo del bar che raggiungiamo seguendo la relazione bar in s.
Si noti che la concatenazione di punti va bene qui perche s.bar e un oggetto, non una collezione di oggetti.

35

36

Esempio: uso illegale del punto


Non possiamo applicare il punto ad una collezione sulla sinistra solo ad un singolo oggetto. Esempio (illegale), con b un oggetto Bar: b.beersSold.price
Questa espressione e un insieme di oggetti Sell. Non ha un prezzo.
37

Select-From-Where di OQL
Possiamo calcolare collezioni simili a relazioni con listruzione OQL: SELECT <lista di valori> FROM <lista di collezioni e nomi per membri tipici> WHERE <condizione>

38

Clausola FROM
Ogni termine della clausola FROM e: <collezione> <nome del membro> Una collezione puo essere:
1. Lestensione di una classe. 2. Una espressione che restituisce una collezione, ad es. alcune espressioni cammino come b.beersSold .
39

Esempio
Ottieni il menu al Joes Bar. SELECT s.beer.name, s.price FROM Sells s WHERE s.bar.name = Joes Bar
Sells e lestensione che rappresenta tutti gli oggetti Sell; s Rappresenta ciascun oggetto Sell, uno alla volta. Espressioni legali. s.beer e un oggetto Beer e s.bar e un oggetto Bar. Si noti che OQL usa le doppie virgolette.

40

Un altro esempio
Anche questa query resituisce il menu di Joe: SELECT s.beer.name, s.price FROM Bars b, b.beersSold s WHERE b.name = Joes Bar
b.beersSold e un insieme di oggetti Sell, e s e un tipico oggetto Sell che coinvolge Joes Bar.

Osservazioni sulle espressioni cammino


Se una espressione cammino denota un oggetto, puoi estenderla con un altro punto e una proprieta di quellogetto.
Esempio: s, s.bar, s.bar.name .

Se una espressione cammino denota una collezione di oggetti, non puoi estenderla ma la puoi usare nella clausola FROM.
Esempio: b.beersSold .

41

42

Tipo del risultato


Come default, il tipo del risultato di una selectfrom-where e un Bag di Struct.
Struct ha un campo per ogni termine nella clausola SELECT. Il suo nome e tipo sono presi dallultimo nome nella espressione cammino.

Esempio: tipo del risultato


SELECT s.beer.name, s.price FROM Bars b, b.beersSold s WHERE b.name = Joes Bar Ha tipo: Bag(Struct(name: string, price: real))

Se la SELECT ha solo un termine, tecnicamente il risultato e una Struct con un solo campo.
Ma una struttura con un solo campo e identificata con il campo stesso.

43

44

Ridenominare i campi
Per cambiare il nome di un campo, far precedere il termine dal nome e da due punti. Esempio: SELECT beer: s.beer.name, s.price FROM Bars b, b.beersSold s WHERE b.name = Joes Bar Il tipo del risultato e Bag(Struct(beer: string, price: real)).
45

Produrre un Set di Struct


Aggiungere DISTINCT dopo SELECT per rendere il risultato un insieme ed eliminare i duplicati. Esempio: SELECT DISTINCT s.beer.name, s.price FROM Bars b, b.beersSold s WHERE b.name = Joes Bar Il tipo del risultato e Set(Struct(name: string, price: real))
46

Produrre una lista di Struct


Si usa una clausola ORDER BY, come in SQL, per rendere il risultato una lista di Struct, ordinata in base ai campi elencati nella clausola ORDER BY.
Lordine ascendente (ASC) e il default; quello discendente (DESC) e una opzione.

Esempio: liste
Sia joeMenu una variabile del linguaggio ospite del tipo List(Struct(name:string, price:real)) joeMenu = SELECT s.beer.name, s.price FROM Bars b, b.beersSold s WHERE b.name = Joes Bar ORDER BY s.price;
48

Si accede agli elementi della lista con lindice [1], [2], Ha operazioni simili ai cursori SQL.
47

Esempio, continua
Ora joeMenu ha un valore che e una lista di Struct, con coppie nome e prezzo per tutte le birre vendute da Joe. Possiamo trovare il primo elemento (la birra con prezzo piu basso) della lista con joeMenu[1], il secondo con joeMenu[2] e cosi via. Esempio: il nome della birra piu economica di Joe: cheapest = joeMenu[1].name;
49

Esempio, conclusione
Dopo aver calcolato joeMenu, possiamo stampare il menu di Joe con codice C++ del tipo: cout << Beer\tPrice\n\n; for (i=1; i<=COUNT(joeMenu); i++) cout << joeMenu[i].name << \t << joeMenu[i].price << \n;
COUNT fornisce il numero di membri di una qualsiasi collezione
50

Sottoquery
Una espressione select-from-where puo essere circondata da parentesi e usata come una sottoquery in molti modi, come:
1. In una clausola FROM, come una collezione. 2. In espressioni EXISTS e FOR ALL.

Esempio: sottoquery in FROM


Trova i produttori di birre vendute da Joe: Bag di oggetti Beer SELECT DISTINCT b.manf per le birre vendute da Joe FROM ( SELECT s.beer FROM Sells s WHERE s.bar.name = Joes Bar )b Tecnicamente una Struct a un campo contenente
51

un oggetto Beer, ma identificato con loggetto 52 stesso.

Quantificatori
Due espressioni booleane da usare nelle clausole WHERE: FOR ALL x IN<collezione>:<condizione> EXISTS x IN <collezione>:<condizione> Vera se e solo se tutti (rispett. almeno uno) i membri della collezione soddisfano la condizione.
53

Esempio: EXISTS
Trova tutti i nomi dei bar che vendono almeno una birra per piu di $5. SELECT b.name FROM Bars b WHERE EXISTS s IN b.beersSold : s.price > 5.00
Almeno un oggetto Sell per il bar b ha un prezzo superiore a $5.
54

Un altro esempio con i quantificatori


Trova i nomi di tutti i bar tali che le uniche birre che vendono per piu di $5 sono prodotte da Pete.
SELECT b.name FROM Bars b WHERE FOR ALL be IN ( SELECT s.beer FROM b.beersSold s WHERE s.price > 5.00 ) : be.manf = Petes
Bag di oggetti Beer (dentro a strutture) per tutte le birre vendute dal bar b per piu di $5.

Conversioni semplici
Come illustrato, una Struct a un solo campo e automaticamente convertita nel valore dellunico campo.
Struct(f : x) e convertita in x.

Una collezione di un elemento puo essere convertita nellelemento, ma abbiamo bisogno delloperatore ELEMENT.
Ad es., ELEMENT(Bag(x )) = x.
56

Struct a un campo sono automaticamente 55 convertite, quindi be puo essere pensato come un oggetto Beer.

Esempio: ELEMENT
Assegna alla variabile p di tipo reale, il prezzo che Joe chiede per la Bud: p = ELEMENT( SELECT s.price FROM Sells s WHERE s.bar.name = Joes Bar AND s.beer.name = Bud );
Bag con un elemento, una Struct con campo price e valore = il prezzo che Joe chiede per la Bud. 57

Aggregazioni
AVG, SUM, MIN, MAX e COUNT si applicano ad ogni collezione per la quale hanno senso. Esempio: trova e assegna a x il prezzo medio della birra da Joe: x = AVG( SELECT s.price FROM Sells s WHERE s.bar.name = Joes Bar );
Bag di Struct con i prezzi per le birre vendute da Joe.
58

Raggruppamenti
Ricorda i raggruppamenti in SQL:
1. Gruppi di tuple basate sul valore di certi attributi (di raggruppamento). 2. La clausola SELECT puo estrarre da un gruppo solo elementi che hanno senso:
Aggregazioni allinterno di un gruppo. Attributi di raggruppamento, i cui valori sono costanti allinterno del gruppo.
59

Raggruppamenti in OQL
OQL estende lidea del raggruppamento in molti modi:
1. Qualsiasi collezione puo essre partizionata in gruppi. 2. I gruppi possono essere basati su una qualunque (o piu) funzione degli oggetti nella collezione iniziale. 3. Il risutato della query puo essere una qualunque funzione dei gruppi.
60

Schema della GROUP BY di OQL


Collezione iniziale definita da FROM, WHERE
Raggruppa in base ai valori delle funzioni

Esempio: GROUP BY
Illustreremo questi concetti con un esempio: Trova il prezzo medio della birra a ogni bar. SELECT barName, avgPrice: AVG( SELECT p.s.price FROM partition p) FROM Sells s GROUP BY barName: s.bar.name
62

Collezione intermedia, con i valori delle funzioni e partition


Termini della clausola SELECT

Collezione di uscita

61

Collezione iniziale
Basata sul FROM e WHERE (che manca): FROM Sells s La collezione iniziale e un Bag di Struct con un campo per ciascun elemento tipico nella clausola FROM. Qui, un Bag di Struct della forma Struct(s: obj ), dove obj e un oggetto Sell.
63

Collezione intermedia
In generale, un Bag di Struct con un componente per ciascuna funzione nella clausola GROUP BY, piu un componente sempre chiamato partition. Il valore di partition e linsieme di tutti gli oggetti della collezione iniziale che appartengono al gruppo rappresentato da questa Struct.
64

Esempio: collezione intermedia


SELECT barName, avgPrice: AVG( SELECT p.s.price FROM partition p) FROM Sells s GROUP BY barName: s.bar.name
Una funzione di raggruppamento. Il nome e barName, il tipo e stringa. La collezione intermedia e un insieme di Struct con campi barName: string e partition: Set(Struct(s: Sell))
65

Esempio: membro tipico


Un membro tipico della collezione intermedia nel nostro esempio e : Struct(barName : Joes Bar, partition : {s1, s2,,sn }) Ogni membro di partition e un oggetto Sell si, per il quale si .bar.name e Joes Bar.
66

La collezione di uscita
La collezione di uscita e calcolata dalla clausola SELECT, come sempre. Senza una clausola GROUP BY, la clausola SELECT ottiente la collezione iniziale dalla quale produce il suo output. Con la GROUP BY, la clausola SELECT e calcolata dalla collezione intermedia.
67

Example: Output Collection


SELECT barName, avgPrice: AVG( SELECT p.s.price FROM partition p)
Estrai il campo barName dalla Struct di un gruppo Da ciascun membro p della partition del gruppo, ottieni il campo s (loggetto Sell), e da quelloggetto estrai il prezzo.

Calcola la media di questi prezzi per creare il valore del campo avgPrice nelle Struct della collezione di uscita.

Tipica Struct di uscita: Struct(barName : Joes Bar, avgPrice : 2.83)


68

Un esempio meno tipico


Trova per ciascuna birra, il numero dei bar che applicano un prezzo basso (<2$) e il numero dei bar che applicano un prezzo alto ( > $4) per quella birra. Strategia raggruppa secondo tre valori:
1. Il nome della birra. 2. Una funzione booleana che e VERA se e solo se il prezzo e basso. 3. Una funzione booleana che e VERA se e solo se il prezzo e alto.
69

La query
SELECT beerName, low, high, count: COUNT(partition) FROM Beers b, b.soldBy s GROUP BY beerName: b.name, low: s.price < 2.00, high: s.price > 4.00
Collezione iniziale: Struct della forma Struct(b: oggetto Beer, s: oggetto Sell), dove s.beer = b.
70

La collezione intermedia
Un insieme di Struct con quattro campi:
1. 2. 3. 4. beerName: string low: boolean high: boolean partition: Set(Struct(b: Beer, s: Sell))

Struct tipici nella collezione intermedia


beerName low high partition Slow Bud TRUE FALSE Bud FALSE TRUE Shigh Bud FALSE FALSE Smid Slow , ecc., sono insiemi di coppie Beer-Sell. Si noti che low e high non possono essere entrambi veri; il gruppo corrispondente e sempre vuoto. 72

71

La collezione di uscita
SELECT beerName, low, high, count: COUNT(partition) Copia i primi tre componenti di ciascuna Struct intermedia e conta il numero di coppie nel suo campo partition, ad es.: beerName low high count Bud TRUE FALSE 27
73