Banco de Dados II 2009.2
Prof. Cláudio Baptista, Ph.D.






Histórico
Crítica ao Modelo Relacional
Exemplo de Motivação
Introdução ao Modelo de Objetos
ODMG ODL
ODMG OQL










1986 SQL-86 (SQL1) - padrão originalmente desenvolvido pela ANSI,
posteriormente adotado pela ISO
1989 SQL-89 - extensão do SQL-86 publicado em 89
OMG - criação do Object Management Group
1991 ODMG - criação do Object Database Management Group
1992 SQL-92 (SQL2) - padrão aprovado pela ISO
1993 ODMG 1.2
1996 SQL-92/PSM - extensão do SQL-92
- provê linguagem computacionalmente completa
1997 ODMG 2.0
1999 SQL:1999 (SQL3) - padrão aprovado em 1999 pela ISO (após 7
anos de trabalho)
◦ - "SQL orientada a objeto"
◦ - SGBDs comerciais oferecem parte do SQL:1999


2000 ODMG 3.0
2004 SQL-2003
◦ Aprimoramento de SQL:1999
◦ Introdução de XML

Abandono gradual do padrão (SQL-92)
◦ MOOSE - major object-oriented SQL extensions:
 inúmeras propostas acadêmicas e industriais para
estender SQL-92 com conceitos OO

Aplicações presas a:
◦ extensões OO ad-hoc oferecidas pelos SGBDs
comerciais, ou
◦ um modelo de dados arcaico (o modelo relacional /
1NF)

Solução:
◦ SQL:1999

SGBDs Relacionais (SGBDRs) - Virtudes:
◦ Estrutura:
 1NF é simples
 Integridade referencial é útil e semanticamente poderosa
◦ Comportamento:
 SQL é declarativa (não navegacional)
 SQL manipula tabelas (conjuntos de tuplas)
◦ Aplicações convencionais:
 "casamento" adequado com SQL através de cursores
◦ sistemas já consolidados no mercado
◦ boa performance
 muitos anos de pesquisa e aprimoramento
 eficiência: otimização de consultas, gerenciamento de
transações
◦ Robustez
◦ Padronização

SGBDs Relacionais (SGBDRs) - Problemas:
◦ Problemas conceituais:
 Estrutura:
 falta de suporte para valores complexos (ou aderência a
1NF):
 força a criação de tabelas artificiais
 falta de suporte para OIDs:
 força a definição de chaves artificiais
 Comportamento:
 SQL não oferece nenhum recurso para encapsulamento
◦ Outros:
 SQL-92 não possui recursão
 Aplicações OO: "descasamento"
SQL e OO-PLs
completo entre

Motivação para BDOO
◦ atender os requisitos de aplicações não
convencionais:





engenharia e manufatura (CAD/CAM, CIM)
aplicações científicas (Meteorologia, Genética, etc.)
aplicações envolvendo dados geográficos (GIS)
aplicações multimídia / hipermídia
...
◦ acompanhar a evolução de LPs

SGBDs Orientado a Objetos (SGBDOO)
◦ modelo de dados mais rico
 adequado ao mercado de aplicações não convencionais
◦ pior desempenho, se comparado com SGBDR
◦ heterogeneidade a nível de modelo e de
capacidades de consulta e atualização

SGBDs Objeto-Relacional (SGBDOR)
◦ combina as melhores características do modelo de
objetos no modelo relacional
 modelo rico + eficiência no gerenciamento de dados
◦ tecnologia relativamente nova
◦ exemplos: Oracle 11g, Informix, DB2, Postgresql


Crítica do Modelo Relacional
◦ Novas aplicações necessitam de novos
conceitos, principalmente tipos complexos
de dados e encapsulamento
◦ Vários desses novos conceitos existem há
muitos anos em linguagens de programação
orientadas a objeto
Um Exemplo de Motivação
◦ Nosso problema é de BD espacial. Trata-se
de achar os retângulos superpondo o
quadrado de lado de tamanho um


Condições para a superposição: x1 <= 1 e y1
<= 1;
X2 >= 0 e y2 >= 0, não importando o
quadrante
As condições para a superposição são válidas se
x2 > x1 (ou ponto P2 à direita de ponto P1)
 Solução
relacional
◦ Retângulos (X1, X2, Y1, Y2)
◦ Regra de integridade: Check (X2 > X1)
SELECT *
FROM RETANGULOS
WHERE (x1 <= 1 AND y1 <= 1)
AND y2 >=0)
AND (x2 >= 0

Três problemas com esta solução
◦
◦
◦

P1. Esquema obscuro
P2. Consulta obscura
P3. Execução com provável baixo desempenho.
Como indexar a tabela Retângulos?
Queremos:
a. Representar um ponto como ponto
b. Escrever uma consulta legível
c. Desempenho
Solução: BDOO
Solução BDOO: Esquema
Repositório:
Retângulos
Retângulo
N
sobrepoe_quadrado
_de_lado_um();
...
Definido_por
{Ponto2.X > Ponto1.X}
2
Ponto
X
Y
Linguagem de Consulta OO, Estilo
SQL
• Quais os retângulos que sobrepõem um
quadrado de lado um?
− Select r.ponto1, r.ponto2
From Retangulos r
Where
r.sobrepoe_quadrado_de_lado_um()
Basta ler, para entender!
sobrepoe_quadrado_de_lado_um() é indexável,
como qualquer coluna de tabela
Encapsulamento
• Encapsulamento das condições de
sobreposição
Boolean sobrepoe_quadrado_lado_um()
{
If ((self.ponto1.x1 <= 1 and self.ponto1.y1 <= 1)
and
(self.ponto2.x2 >= 0 and self.ponto2. y2
>=0))
then return true
else return false; }
Encapsulamento
• Regra de integridade: implementada
no método construtor Retangulo()
Retangulos agora torna-se um
repositório de objetos da classe
Retangulo
• O encapsulamento deve ser parcial,
para ainda permitir interfaces estiloSQL (Select colunax ...)
O Mercado de SGBDs OO
• SGBD OO puro:
•
•
•
•
•
Versant
O2 Technology
Objectivity
Servio Logic
Object Design: ObjectStore
• SGBDOR:
− Oracle 11g
− IBM DB2
− Informix
• Incorporado pela IBM
− Postgresql



ODMG - Object Database Management Group
ODL - Object Definition Language, como o
CREATE TABLE do SQL
OQL - Object Query Language, tenta imitar
SQL no framework OO

ODMG imaginou que vendedores de SGBD OO
implementariam uma linguagem OO como
C++ com extensões (OQL), que permitisse o
programador transferir dados entre o banco
de dados e a linguagem hospedeira de forma
fácil.






Fundação: setembro de 1991
Objetivo: definir um padrão para garantir a
portabilidade das aplicações escritas seguindo o
modelo OO
Presidente: R. G. G. Cattell
Web site: www.odmg.org
Versões: ODMG 1.2 (1993), ODMG 2.0 (março
1997), ODMG 3.0 (janeiro 2000)
Padrões definidos pelo ODMG:
◦
◦
◦
◦
modelo de objetos
linguagem de definição de dados - ODL
linguagem de consulta - OQL
acoplamento com C++ , Smalltalk e Java


Literal = valor + comportamento
Classificação dos literais:
◦ Atomic: corresponde aos tipos de dados simples
◦ Strutured: criado usando o construtor Struct
◦ collection criado com os construtores
Set<t>, Bag<t>, List<t>, Array<t>,
Dictionary<k,t>
onde t é o tipo de objetos ou literais na coleção
e k é o tipo da chave, no caso de dicionários
(note que t pode ser um tipo de objeto ou literal)

Objeto = OID + nome + estado +
comportamento
◦ OID = identificador interno gerado pelo sistema, não
sendo visível ao usuário
◦ nome:
 é opcional
 deverá ser único no BD a que o objeto pertence
 os objetos nomeados servirão de pontos de entrada para o
BD
◦ estado = valores das propriedades do objeto, incluindo:
 atributos do objeto
 relacionamentos (binários) entre o objeto e outros objetos
◦ comportamento = operações permitidas sobre o objeto

Fábrica = objeto utilizado para gerar ou criar
outros objetos
◦ possui necessariamente uma operação que gera
novos objetos (como novos OIDs)

Interface = definição de estrutura +
assinaturas de operações
◦ as interfaces não podem ser instanciadas, ou
seja,não podem gerar conjuntos de objetos
◦ utilizadas essencialmente para organizar as
operações



Classes = definição de estrutura + assinaturas de
operações
as classes podem ser instanciadas, ou seja, podem
gerar extensões - conjuntos de objetos – e definir
chaves para estas extensões
a definição da estrutura inclui a especificação de:
◦ atributos:
 simples e complexos
 de referência, utilizados para representar relacionamentos 1-n
entre os objetos da classe e objetos de outra classe
◦ relacionamentos:
 utilizados para representar relacionamentos binários 1-n ou nm entre os objetos da classe e objetos de outra classe:
 permitem especificar o relacionamento inverso
 não devem ser utilizados quando o relacionamento n-m possui
atributos

Herança Comportamental (via ":")
◦ uma interface pode ser uma especialização de
outras interfaces,das quais herda as operações
◦ uma classe pode ser uma especialização de outras
interfaces, das quais herda as operações

Herança Comportamental e Estrutural (via
Extends)
◦ uma classe pode ser uma especialização de apenas
outra classe, da qual herda a estrutura e as
operações

ODL é usado para definir classes persistentes,
cujos objectos podem ser armazenados
permanentemente no BD.
◦ Classes ODL assemelham-se a Entity sets com
relacionamentos binários, mais métodos.

Uma Declaração de classe inclui:
1. Um nome para a classe.
2. Declaração de chaves (key) opcional.
3. Declaração de Extent = nome para o conjunto de
objetos correntes na classe (instâncias).
4. Declaração de Elementos. Um element pode ser
um atributo, um relacionamento, ou um método.
class <nome> {
<lista de declarações de elementos,
separados por ; >
}
Exemplo:
Class Estudante (extent Estudantes) {
attribute string name;
attribute int idade;
}


Atributos são elementos com um tipo que
não envolve classes.
attribute <tipo> <nome>;
Relacionamentos conectam um objeto ao um
ou mais outros objetos de uma classe.
relationship <tipo> <nome>
inverse <relationship>;



Suponha uma classe C que tenha um
relacionamento R a uma classe D.
Então a classe D deve ter algum
relacionamento S à classe C.
R e S devem ser inversos.
◦ Se um objeto d está relacionado a um objeto c via
R, então c deve estar relacionado a d via S.
Ex.: Atributos e Relacionamentos
class Bar {
O tipo de relacionamento serves
attribute string name;
É um set de Beer objects.
attribute string addr;
relationship Set<Beer> serves inverse Beer::servedAt;
}
O operador :: conecta um nome
class Beer {
à direita ao contexto do
attribute string name;
nome à esquerda
attribute string manf;
relationship Set<Bar> servedAt inverse Bar::serves;
}
33
Tipos de Relacionamentos

O tipo de um relacionamento é:
1. Uma classe, como Bar. Neste caso, um
objeto com este relacionamento pode estar
conectado a apenas um objeto Bar.
2. Set<Bar>: o objeto está conectado a um
conjunto de objetos Bar.
3. Bag<Bar>, List<Bar>, Array<Bar>: o objeto
está conectado a um bag, list, ou array de
objetos Bar.
34
Multiplicidade dos Relacionamentos




Todos os relacionamento ODL são
binários.
Relacionamentos Muitos-para-Muitos
têm Set<…> para o tipo do
relacionamento e seu inverso.
Relacionamentos Muitos-para-Um têm
Set<…> no relacionamento do lado Um e
a apenas a classe para o relacionamento
do lado Muitos
Relacionamentos Um-para-Um têm
classes com o tipo em ambas direções.
35
Exemplo: Multiplicidade
class Drinker { …
relationship Set<Beer> likes inverse Beer::fans;
relationship Beer favBeer inverse
Beer::superfans;
Many-many uses Set<…>
}
in both directions.
class Beer { …
relationship Set<Drinker> fans inverse
Drinker::likes;
relationship Set<Drinker> superfans inverse
Drinker::favBeer;
Many-one uses Set<…>
}
only with the “one.”
36
Exemplo2: Multiplicidade
husband and wife are
one-one and inverses
of each other.
class Drinker {
attribute … ;
relationship Drinker husband inverse wife;
relationship Drinker wife inverse husband;
relationship Set<Drinker> buddies
inverse buddies;
}
buddies is many-many and its
own inverse. Note no :: needed
if the inverse is in the same class.
37
Lidando com Relacionamentos
Múltiplos


ODL não dar suporte a relacionamentos
ternários.
Podemos simular relacionamentos
ternários através de uma classe de
“conexão”, cujos objetos representam
tuplas de objetos que nós gostariamos de
conectar via o relacionamento ternário.
38
Classes de Conexão



Suponha que queremos conectar as classes
X, Y, e Z através do relacionamento R.
Projete uma classe C, cujos objetos
representam uma tripla de objetos (x, y, z)
das classes X, Y, and Z, respectivamente.
Precisamos de três muitos-para-um
relacionamentos de (x, y, z) para cada um
de x, y, e z.
39
Exemplo: Classe de Conexão

Suponha que tenhamos as classes Bar e
Beer, e queremos representat o preço de
cada Beer em vendida em cada Bar.
◦ Um relacionamento muitos-para-muitos entre
Bar e Beer não pode ter o atributo preço como
ocorre no modelo E/R.

One solution: cria-se a classe Price e uma
classe de conexão BBP para representar
uma tripla bar, beer, e price.
40
Exemplo --- Continuação

Uma vez que objetos Price são apenas
números, uma melhor solução seria:
1. Dar aos objetos BBP um atributo price.
2. Usar dois relacionamentos muitos-para-um
entre um objeto BBP e os objetos Bar e Beer.
41
Exemplo, em ODL
Definição de BBP:
class BBP {
attribute price:real;
relationship Bar theBar inverse Bar::toBBP;
relationship Beer theBeer inverse
Beer::toBBP;
}
 Bar e Beer devem ser modificados para
incluir relacionamentos, ambos chamados
toBBP, e ambos do tipo Set<BBP>.

42
Structs e Enums
Atributos podem ter uma estrutura (com
em C) ou ser uma enumeration.
 Declare com
attribute [Struct ou Enum] <nome do
struct ou enum> { <detalhes> }
<nome do atributo>;
 Detalhes são os nomes dos campos e tipos
de um Struct, uma lista de constantes de
um Enum.

43
Exemplo: Struct e Enum
Nomes para a
class Bar {
estrutura e
attribute string name;
enumeração
attribute Struct Addr
{string street, string city, int zip} address;
attribute Enum Lic
{ FULL, BEER, NONE } license;
relationship …
nomes dos
}
atributos
44
Declarações de Métodos


Uma definição de classe pode incluir
declarações de métodos para a classe.
Informação consiste de:
1. Tipo de retorno, se algum.
2. Nome do método.
3. Argument modes e tipos (sem nomes).

Modes são in, out, e inout.
4. Quaisquer exceções que o método possa
lançar.
45
Exemplo: Métodos
real cre(in string)raises(semNotas);
1.
O método cre retorna um número real, que
contém o CRE de um aluno.
2.
cre recebe um argumento, uma string
(matrícula do aluno) e não modifica este
argumento.
3.
cre pode lançar a exceção semNotas.
46
Tipos em ODL


Tipos básicos: int, real/float, string,
enumerated types, e classes.
Type constructors:
◦ Struct para estruturas.
◦ Collection types : Set, Bag, List, Array, e Dictionary
( = mapeamento de um tipo domínio type para um
tipo imagem).

Tipos Relationship podem apenas ser uma
classe ou um tipo collection aplicado a uma
classe.
47
ODL Subclasses



Usual object-oriented subclasses.
Indica superclasse com extends e seu
nome.
Subclasse lista apenas as propriedades
únicas à mesma.
◦ Herda as propriedades da superclasse.
48
Exemplo: Subclasses
Maltada é uma subclasse de beers:
class Maltada extends Beer {
attribute string color;
}

49
ODL permite herança múltipla
 Conflitos são resolvidos a nível de
implementação
class Anime extends Filme:Cartoon {
attribute …
}

ODL Keys



Podem declarar chaves para uma classe.
Depois do nome da classe, adicionamos:
(key <list of keys>)
Uma key com mais de um atributo precisa
de parênteses adicionais ao redor dos
atributos.
51
Exemplo: Keys
class Beer (key name) { …
 nome é a key para beers.
class Course (key
(dept,number),(room, hours)){
 dept and number formam uma key; como
também room e hours.
52
Extents

Para cada classe existe um extent, o
conjunto de objetos existentes na classe
(instâncias)
◦ Podemos pensar o extent como uma relação
cuja classe é seu esquema.

Indique extent depois do nome da classe,
junto com as keys, como:
(extent <extent name> … )
53
Exemplo: Extents
class Beer
(extent Beers key name) { …
}
 Convenção, usa-se singular para nomes
de classes, e plural para o extent
correspondente.
54



Consultas a repositórios de classes - ODL
OQL combina os aspectos declarativos da
linguagem SQL com o paradigma de
programação OO
Apresentação by example
Path Expressions

Seja x um objeto da classe C.
1. Se a é um atributo de C, então x.a é o valor
daquele atributo.
2. Se r é um relacionamento de C, então x.r é o
valor para o qual x está conectado por r.

Poderia ser um objeto ou um conjunto de
objetos, dependendo do tipo de r.
3. Se m é um método de C, então x.m (…) é o
resultado de aplicar m a x.
56
Running Example
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;
}
57
Running Example --- Cont.
class Beer (extent Beers) {
attribute string name;
attribute string manf;
relationship Set<Sell> soldBy inverse Sell::beer;
}
58
Exemplo: Path Expressions

Seja s be uma variável do tipo Sell, i.e.,
um objeto bar-beer-price.
1. s.price = o preço no objeto s.
2. s.bar.addr = o endereço do bar que pode ser
alcançado seguindo relacionamento bar em
s.

Note que a cascata de pontos está OK aqui,
pois s.bar é um objeto, e não uma coleção de
objetos.
59
Exemplo: Uso Ilegal do .


Não podemos aplicar o . A uma coleção na
esquerda, apenas a um único objeto.
Exemplo (ilegal), com b sendo um objeto
Bar:
b.beersSold.price
Esta expressão é um conjunto de objetos Sell.
Não tem um price.
60
OQL Select-From-Where
Similar a SQL:
SELECT <lista de valores>
FROM <lista de coleções e nomes>
WHERE <condição>
61
Cláusula FROM
Cada termo da cláusula FROM é:
<collection> <member name>

Uma coleção pode ser:

1. O extent de alguma classe.
2. Uma expressão que leva a uma coleção, e.g.,
certas path expressions como b.beersSold .
62
Exemplo

Obtenha o menu do Joe’s Bar.
SELECT s.beer.name, s.price
FROM Sells s
WHERE s.bar.name = “Joe’s Bar”
Sells é o extent
representando todos
objetos Sell; s
representa cada
objeto Sell
Expressões legais
s.beer é um objeto
beer e s.bar
é um objeto Bar
Note OQL
usa aspas.
63
Exemplo 2

Esta query também obtém Joe’s menu:
SELECT s.beer.name, s.price
FROM Bars b, b.beersSold s
WHERE b.name = “Joe’s Bar”
b.beersSold é o conjunto de objetos Sell,
e s é um objeto Sell que envolve o
Joe’s Bar.
64
Dica para Uso de Path Expressions

Se uma path expression denota um objeto,
você estendê-lo com outro . e uma
propriedade daquele objeto.
◦ Exemplo: s, s.bar, s.bar.name .

Se uma path expression denota uma coleção
de objetos, você NÃO estendê-lo, mas pode
usá-lo na cláusula FROM.
◦ Exemplo: b.beersSold .
65
O Result Type

Por default, o tipo do resultado de um selectfrom-where é um Bag of Structs.
◦ Struct tem um campo para cada termos da cláusula
SELECT. Seus nomes e tipos são obtidos do ;ultimo
nome na path expression.

Se SELECT tem apenas um termo,
tecnicamente o result é um one-field struct.
66
Exemplo: Result Type

SELECT s.beer.name, s.price
FROM Bars b, b.beersSold s
WHERE b.name = “Joe’s Bar”
Tem tipo:
Bag(Struct(name: string, price: real))
67
Renomeando os Campos



Para modificar os nomes dos campos,
preceda-os pelo nome e : .
Exemplo:
SELECT beer: s.beer.name, s.price
FROM Bars b, b.beersSold s
WHERE b.name = “Joe’s Bar”
Result type é:
Bag(Struct(beer: string, price: real)).
68
Produzindo um Set of Structs
Adicione DISTINCT no SELECT para
eliminar duplicatas.
 Exemplo:
SELECT DISTINCT s.beer.name, s.price
FROM Bars b, b.beersSold s
WHERE b.name = “Joe’s Bar”
 Result type é:
Set(Struct(name: string, price: string))

69
Subqueries

Uma expressão select-from-where pode
conter parêntesis e usado como uma
subquery de várias maneiras, como:
1. Numa cláusula FROM, como uma coleção.
2. Em expressões EXISTS e FOR ALL.
70
Exemplo: Subquery em FROM
Encontre os fabricantes de cervejas
Bag de objetos Beer
vendidas por Joe’s:
Para as beers vendidas por
SELECT DISTINCT b.manf
Joe
FROM (
SELECT s.beer FROM Sells s
WHERE s.bar.name = “Joe’s Bar”
)b

71
Quantificadores
Duas expressões booleanas para uso em
cláusulas WHERE:
FOR ALL x IN <collection> : <condition>
EXISTS x IN <collection> : <condition>
 True sss todos membros (resp. pelo menos
um membro) da coleção satisfaz a
condição.

72
Exemplo: EXISTS

Encontre todos os nomes de bares que
vendem ao menos uma cerveja por mais de
$5.
SELECT b.name FROM Bars b
WHERE EXISTS s IN b.beersSold :
s.price > 5.00
Ao menos um objeto Sell para bar
b tem preço acima de $5.
73
Exemplo 2

Encontre os nome de todos os bares nos
quais as únicas cervejas que eles vendem
por mais de $5 são fabricadas por Pete’s.
Bag de objetos Beer
SELECT b.name FROM Bars b
Para todas as beers
WHERE FOR ALL be IN (
vendidas pelo bar b
SELECT s.beer FROM b.beersSold s por mais de $5.
WHERE s.price > 5.00
) : be.manf = “Pete’s”
74
Agregações
AVG, SUM, MIN, MAX, e COUNT se
aplicam a qualquer coleção onde faça
sentido.
 Exemplo: Encontre e atribua a x o preço
médio de cervejas em Joe’s:
x = AVG(
SELECT s.price FROM Sells s
WHERE s.bar.name = “Joe’s Bar”
);

Bag of structs com os preços
para as beers vendidas por Joe’s.
75
Class Filme
(extent Filmes key (tiitulo, ano))
{
attribute string titulo;
attribute integer ano;
attribute integer duracao;
attribute enum TipoFilme (cores, pretoebranco) tipo;
relationship Set <Estrela> estrelas
inverse Estrela::estreladoEm;
relationship Estudio produzidoPor
inverse Studio::produziu;
float duaracaoEmHoras() raises (duracaoNãoEncontrada);
void nomesEstrelas(out Set<String>);
void outrosFilmes (in Estrela, out Set<Filme>) raises
(notFound);
};
Class Estrela
(extent Estrelas key nome)
{
attribute string nome;
attribute Struct End {string rua, string cidade}
endereco;
relationship Set <Filme> estreladoEm
inverse Filme::estrelas;
};
Class Estudio
(extent Estudios key nome)
{
attribute string nome;
attribute string endereco;
relationship Set <Filme> produziu
inverse Filme::produzidoPor;
};
Consultas Intra-Classe

Qual o ano do filme "E o vento levou“?
SELECT f.ano
FROM Filmes f
WHERE f.título = "E o vento levou?"
◦ f é uma variável do tipo Filme que "varre" o
repositório Filmes (isto é, pode receber cada
valor da repositório corrente Filmes)
Consultas Inter-Classes

Quais os nomes das estrelas do
filme "Casablanca"?
SELECT e.nome
FROM Filmes f, f.estrelado_por e
WHERE f.título = "Casablanca"
For each f in Filmes do
If f.título = "Casablanca" then
For each e in f.estrelado_por then
Add e.nome to output bag
◦ Note o tratamento unificado para
atributos e relacionamentos
Consultas Com Método

Quais os títulos e anos dos filmes com
mais de 2 horas de duração?
SELECT f.título, f.ano
FROM Filmes f
WHERE f.duração_em_horas( ) > 2.0;
/* pode ser também duração_em_horas(f) */
◦ Note o tratamento unificado para atributos,
relacionamentos e métodos

Se o denota um objeto pertencendo a uma
classe C, e p é uma propriedade da classe,
então o.p é o resultado de aplicar p a o
◦ Se p é um atributo, então o.p é o valor do atributo
no objeto o
◦ Se p é um relacionamento, então o.p é o objeto ou
coleção de objetos relacionados com o através do
relacionamento p
◦ Se p é um método (talvez, com parâmetros), então
o.p é o resultado de aplicar o método a o

Pode ser usado o símbolo -> em lugar do
ponto


O valor de meu_filme.duração é a duração
do filme, isto é, o valor do atributo duração
para o objeto Filme denotado por
meu_filme
O valor de meu_filme.duração_em_horas() é
um número real, a duração do filme em
horas, calculada pela aplicação do método
duração_em_horas() ao objeto meu_filme



O valor de meu_filme.estrelado_por é o
conjunto de objetos Estrela que estrelaram o
filme meu_filme
A expressão meu_filme.estrelas (nomes) não
retorna valor (em C++, o tipo de função void).
Entretanto retorna o conjunto dos nomes das
estrelas de meu_filme (parâmetro de saída
nomes, do tipo coleção)
O que significa meu_filme.realizado_por.nome?

Estilo SQL
◦ Select-From-Where


A palavra-chave SELECT seguida por uma
lista de expressões
A palavra-chave FROM seguida por uma ou
mais declarações de variáveis simples. Uma
variável é declarada por dar
◦ uma expressão cujo valor tem um tipo coleção,
isto é, um conjunto, ou bag, ou lista, ou array
◦ A palavra-chave opcional AS
◦ O nome da variável simples, que “varre” a coleção



Tipicamente, a expressão de (a) é o repositório
de alguma classe, como o repositório Filmes da
classe Filme. Entretanto, qualquer expressão
que produza uma coleção de objetos pode ser
utilizada, incluindo outra expressão SelectFrom-Where
A palavra-chave WHERE é uma expressão
booleana. Este expressão, como a expressão
seguindo o SELECT, pode usar somente
constantes e variáveis declaradas na cláusula
FROM
Uma consulta produz um bag de objetos
SELECT DISTINCT e.nome
FROM Filmes f, f.estrelado_por e
WHERE f.realizado_por.nome = "Disney"
Set<Struct N {string c1, string c2}> N1
N1 = SELECT DISTINCT Struct(estrela1:
e1.nome, estrela2: e2.nome)
FROM Estrelas e1, Estrelas e2
WHERE e1.endereço = e2.endereço
AND e1.nome < e2.nome
SELECT DISTINCT e.nome
FROM (SELECT f
FROM Filmes f
WHERE f.realizado_por.nome =
"Disney") d, d.estrelado_por e
SELECT f
FROM Filmes f
WHERE f.realizado_por.nome = "Disney"
ORDER BY f.duração, f.título

FOR ALL x IN C : C(x), onde C é um conjunto,
x é uma variável, e C(x) é uma condição
SELECT e
FROM Estrelas e
WHERE ALL f IN e.estrelou_em :
f.realizado_por.nome = "Disney"

EXISTS x IN C : C(x)
SELECT e
FROM Estrelas e
WHERE EXISTS f IN e.estrelou_em :
f.realizado_por.nome = "Disney"

OQL usa os mesmos cinco operadores de
agregação usados em SQL: AVG, COUNT, SUM,
MIN, e MAX.
◦ Aplicáveis a qualquer coleção cujos membros são
de tipos apropriados
SELECT ... AVG(SELECT f.duração
FROM Filmes f)...

A forma de uma cláusula GROUP BY em OQL
é
◦ As palavras chave GROUP BY
◦ Uma lista de atributos-partição ("partition
attributes"). Cada atributo-partição consiste de
 Um nome de uma variável (um critério de agregação)
 Dois pontos
 Uma expressão mencionando uma variável na cláusula
FROM



Na lista do SELECT, só podem aparecer os
critérios de agregação, e os valores
agregados
O valor retornado pela cláusula GROUP BY é
um conjunto de estruturas
Cada estrutura tem a forma
Struct(critério_agregação1:v1, ...,
critério_agregaçãon:vn,
lista_de_valores_agregados)

Os valores agregados referem-se a uma
partição (um conjunto de valores de
atributos-partição)
SELECT nome_estúdio, ano_filme,
média_durações:
AVG(SELECT p.f.duração FROM partition p)
FROM Filmes f
GROUP BY nome_estúdio: f.realizado_por.nome,
ano_filme: f.ano
HAVING MAX(SELECT p.f.duração FROM
partition p) > 120

Pode-se aplicar os operadores de união
(UNION), interseção (INTERSECT) e diferença
(EXCEPT) a duas coleções compatíveis de
objetos
(SELECT DISTINCT f
FROM Filmes f, f.estrelado_por e
WHERE e.nome = "Harrison Ford")
EXCEPT
(SELECT DISTINCT f
FROM Filmes f
WHERE f.realizado_por = "Disney")
Set<Filme> Velhos_filmes
Velhos_filmes = SELECT DISTINCT f
FROM Filmes f
WHERE f.ano < 1920;
List<Filme> Minha_lista
Minha_lista = SELECT f
FROM Filmes f
ORDER BY f.título, f.ano
Filme Meu_filme
Meu_filme = ELEMENT(SELECT f
FROM Filmes f
WHERE f.título = "E o Vento Levou")

Considere a classe
Class Empregado
(extent Empregados key matricula)
{
attribute string matricula;
attribute string nome;
attribute float salario;
relationship Set<Empregado> gerencia
inverse Empregado::eh_gerenciado_por;
relationship Empregado eh_gerenciado_por
inverse Empregado::gerencia;
...;
}
Escreva em OQL Quais o nome e o salário do
gerente de Natasha?

Seja o esquema de filmes, estrelas e
estúdios visto em aula. Escrever em OQL
as seguintes perguntas
◦ Quais os estúdios que realizaram algum filme
com duração maior que a duração de cada filme
realizado pela Eurofilmes?
◦ Quais os estúdios que realizaram mais filmes?
◦ Quais os estúdios que não realizaram filmes
antes de 1960?
◦ Quais as estrelas dos filmes com duração maior que
pelo menos a de um filme realizado pela Disney?
◦ Quais as estrelas que estrelaram em todos os filmes
do estúdio Cinecittá?
◦ Quais os estúdios que menos realizaram filmes?


Não oferece abstrações como visões SQL
Linguagem de consulta stricto sensu
Download

ODMG ODL e OQL