ODMG - Object Database Management Group • Padrão para SGBDOO • Consórcio de pesquisadores e fabricantes • Objetivo – integração e padronização de funcionalidades de BD a uma LPOO • Componentes do padrão – modelo de objetos – linguagem de definição de dados (ODL) – linguagem de consulta (OQL) Modelo de Objetos e ODL • Modelo de objetos – conceitos – dados (objetos e literais) – tipos (interfaces, classes de objetos e literais) – herança – OID e chave • Especificados em ODL Dados • Duas formas de dados são possíveis – objetos e literais • Objetos – possuem valor e OID – são instâncias de classes • Literais – possuem valor e não possuem OID – não são instâncias de uma classe • objetos isolados • objetos componentes de outros objetos Literais • Três tipos – atômicos, estruturados e de coleção • Literais atômicos – tipos de dados básicos (predefinidos) • boolean, char, short, long, float, double, string, ... • Literais estruturados – tipos de dados estruturados (alguns predefinidos) • date, time, timestamp, ... ou definidos pelo usuário • Literais de coleção – tipos de agrupamento de dados (predefinidos) • set<t>, bag<t>, array<t>, ... – t é tipo de objeto ou valor Definição de Dados - ODL • Três formas – interface, literal ou classe • Interface – define apenas comportamento (assinatura) – não possui instâncias • Literal – define apenas propriedades – possui instâncias (sem OID) • Classe – define propriedades e comportamento – possui instâncias (com OID - objetos) Interfaces e Literais em ODL interface Pessoa { short idade(); boolean ehMenor(); void casou(Pessoa p) raises(jahEhCasado); ... }; struct Endereço { attribute string rua; attribute short número; attribute string cidade; }; set<Endereço> EndereçosAmigos; Endereço MeuEndereço; Classes em ODL class Departamento (extent Departamentos) { attribute string nome; attribute short código; attribute Endereço localização; attribute struct atendimento{ horaInício time, horaTérmino time} horário; attribute Empregado chefe; relationship set<Empregado> funcionários inverse Empregado:: depto; void adicionaEmp(short RG) raises (jahTrabalha, RGInexistente); ... atributo literal estruturado }; conjunto de instâncias atributo de referência a objeto atributo literal atômico relacionamento Herança • Duas formas – herança IS-A – herança extends • Herança IS-A – herança de interface – pode ser interfaceinterface ou interfaceclasse – permite herança múltipla • Herança extends – herança de propriedades – ocorre somente entre classes (classeclasse) – não permite herança múltipla Herança em ODL Classe Empregado (extent Empregados) { attribute short RG; attribute string nome; attribute enum gênero{M,F} sexo; attribute Date DN; attribute Endereço residência; attribute float salário; relationship Departamento depto inverse Departamento:: funcionários; ... }; herança extends Classe Professor (extent Professores) extends Empregado : Pessoa { herança IS-A attribute string titulação; attribute string areaAtuação; ... }; OID e Chave • OID – identificador do objeto • Chave – uma ou mais propriedades cujos valores devem ser únicos class Departamentos ( extent todosDeptos key código) { attribute string nome; attribute short código; ... }; class Cidades (key (estado,nome)) { attribute string estado; attribute string nome; ... } Exemplo – Pacientes em ODL class Paciente (extent Pacientes key CPF) { attribute long CPF; attribute long RG; attribute string nome; relationship Leito leito inverse Leito:: paciente; attribute struct responsabilidade { relationship Médico médico inverse Médico:: responsável, horárioVisita time} responsável; relationship set<Médico> tratamento inverse Médico:: tratamento; }; Exemplo – Médicos em ODL class Médico (extent Médicos key CRM) { attribute long CRM; attribute string nome; attribute float salário; attribute Especialidade atuação; attribute set<Especialidade> formação; relationship set<Paciente> responsável inverse Paciente:: responsável.médico; relationship set<Paciente> tratamento inverse Paciente:: tratamento; }; Consultas em BDOOs • Duas abordagens – navegacional • navegação entre objetos através de suas referências (controlada pelo programa da aplicação ou SGBDOO) – declarativa • uso de uma linguagem de consulta do SGBDOO • violação de encapsulamento – maior flexibilidade para formulação de consultas • Não há DML, apenas linguagem de consulta – métodos implementam operações de atualização • Linguagem de consulta do padrão ODMG – OQL (Object Query Language) OQL • Linguagem de consulta declarativa • Extensão da linguagem SQL com suporte ao tratamento de – objetos complexos – junções por valor ou por OID – invocação de métodos • suporta late binding (polimorfismo) – herança Ponto de Partida de uma Consulta • Objeto ou conjunto de objetos – extensão de classe (extent) – literal ou conjunto de literais select e.nome from e in Empregados variável de iteração select e.rua from e in EndereçosAmigos MeuEndereço Resultados de Consultas • Literais, objetos, conjuntos de literais ou de objetos conjunto de objetos select e.* from e in Empregados literal MeuEndereço select struct ( conjunto de literais (estrutura complexa) nome: d.nome empsRicos:(select e.* from e in d.funcionários where e.salário > 5000)) from d in Departamentos Expressões de Caminho • Permitem a navegação entre objetos – caminhamento através de atributos de referência e relacionamentos – utiliza-se a notação de ponto (“.”) • Exemplo select p.nome, p.titulação from p in Professores where p.depto.código = ‘INE’ Expressões de Caminho • Variáveis de iteração são definidas para a navegação em coleções de objetos referenciados (referências 1:N) – a variável de iteração associa-se com cada elemento da coleção referenciada • Exemplo select f.nome from d in Departamentos, f in d.funcionários where d.código = ‘INE’ and f.salário > 5000 Junções • Junções entre conjuntos de objetos ou de literais são permitidas, como em BDRs • Junções de objetos tanto por valor quanto por OID são permitidas • Exemplo select c1.nome from c in Cidades, c1 in Cidades where c1.estado = c.estado and c.nome = ‘Florianopólis’ and c.estado = ‘SC’ Invocação de Métodos • Métodos podem ser declarados em consultas da mesma forma que propriedades • Exemplos select e.nome from e in Empregados where e.idade > 50 select d.código, d.nroHorasAtendimento from d in Departamentos Consultas em Hierarquias de Classes • Consultas aplicadas a uma classe processam objetos da classe e de suas subclasses • Restrições podem ser especificadas • Exemplo select (Professores, Pesquisadores)e.nome from e in Empregados where e.salário > 3000 Funções de Agregação • Aplicadas sobre qualquer conjunto de dados • Exemplos avg(select p.salário from p in Professores where p.depto.código = ‘INE’) select d.código, d.nome from d in Departamentos where count (d.funcionários) > 30