BD II (SI 587)
Banco de Dados Orientados à Objetos e Objeto-Relacional
Prof. Josenildo Silva
Estes slides são baseados nos slides disponibilizados
pelos autores ELMASRI e NAVATHE, para o livro Sistemas de Banco de Dados , 6ª. Edição, Ed. Pearson Brasil.
Capítulo 11. “Banco de Dados de Objetos e Objeto-Relacional”.
Introdução
SGBDs Relacionais proveem
persistência de dados com integridade, segurança, confiabilidade e eficiência
Entretanto, SGBDs Relacionais foram desenvolvidos em uma época em que as linguagem de programação eram
estruturadas (C, COBOL, FORTRAN,
Introdução
Atualmente as linguagens mais
populares são Orientadas à Objeto (
Smalltalk, Eiffel, C++, Java, Ruby, Groovy, Scala ...)
SGBDs mais populares ainda são relacionais (Oracle, PostgreSQL, MySQL, ...)
Introdução
Como prover persistência de alto nível para dados utilizados em
Alternativa 1
Salvar dados em
arquivos do sistema Em Java: POJO
Plain Old Java Object
Serialização de Objetos
Programa OO
Alternativa 2
Utilizar um SGBD Relacional
O programador deve fazer um mapeamento manual entre
os dois mundos Ou utilizar um framework de mapeamento Objeto-Relacional SGBD Relacional Programa OO Mapeamento
Alternativa 2
O modelo relacional não é
adequado para modelagem de
dados com estruturação complexa
Problema da Impedância entre os modelos abstratos OO e Relacional
Alternativa 3 Utilizar um SGBD Objeto-Relacional PostgreSQL, Oracle SGBD Objeto Relacional Programa OO
Alternativa 3
Extensão do SQL para acomodar conceitos de Orientação a Objetos
SQL 99 (antiga SQL 3)
Alternativa 4
Utilizar um SGBD
Orientado à Objetos
Gem Stone, Objectivity, ObjectStore,
db4objects
SGBD Orientado à Objetos
Alternativa 4
SGBDOOs foram propostos para
atender a algumas das necessidades de aplicações mais complexas
CAD, CIM, SIGs,
Permitem especificar:
A estrutura dos objetos complexos
As operações que podem ser aplicadas a esses objetos
Objeto
Origens nas linguagens de programação OO
Um objeto possui estado (valor) e
comportamento (operações)
Variáveis de instância mantém os valores
que definem o estado interno do objeto
Operação definida em duas partes:
Herança
Permite a especificação de novos
tipos ou classes que com base nas
estruturas e operações de tipos ou classes previamente definidas
Sobrecarga
Capacidade de uma operação de ser aplicada a diferentes tipos de objetos
Um nome de operação pode se referir a várias implementações
Identidade de objeto e literais
Identidade única
Implementada por meio de um
identificador de objeto (OID) único e
Estruturas de tipo complexas
Estrutura de complexidade arbitrária Aninhamento de construtores
Construtores básicos: Átomo
Struct (ou tupla)
Encapsulamento de operações
Define o um tipo de objeto com base nas operações
Os usuários externos só se tornam cientes da interface das operações Divide a estrutura de um objeto em atributos visíveis e ocultos
Encapsulamento de operações Operações típicas: Construtor de objeto Operação de destruição Operações modificadoras Operações de acesso
Persistência de objetos
Objetos transientes
Existem no programa em execução Desaparecem quando o programa termina
Persistência de objetos
Objetos persistentes
Armazenados no banco de dados e persistem após o término do
programa
Mecanismo de nomeação Acessibilidade
Outros conceitos
Herança múltipla
Subtipo herda funções (atributos e métodos) de mais de um supertipo
Herança seletiva
Subtipo herda apenas algumas das funções de um supertipo
ODMG
Consórcio formado em 1991 pelos principais pesquisadores e
fabricantes de BDOO
O objetivo era produzir um padrão aberto para SGBDOO
1993 ODMG 1.0 2001 ODMG 3.0
Componentes do modelo
Modelo de dados
Linguagem de definição de objeto (ODL) Linguagem de consulta de objeto (OQL)
O modelo de objeto ODMG Interface
Especifica apenas o comportamento de um tipo de objeto
O modelo de objeto ODMG Class
Especifica tanto o estado (atributos) quanto o comportamento
(operações) de um tipo de objeto Instanciável
Relacionamento e Operações
Relationship: indica que dois objetos no banco de dados estão relacionados
Palavra-chave inverse pode ser utilizada para relacionamento nas direção oposta
Assinaturas de operação: nome de operação, tipos de argumento, valor retornado
Extensões, chaves e fábrica de objetos
Extensões
Formado por todos os objetos persistentes da classe
Chave
Uma ou mais propriedades cujos valores são únicos para cada objeto na extensão
Fábrica de objeto
A linguagem de definição de objeto ODL
Usada para definir os tipos de
objeto para determinada aplicação de banco de dados
A linguagem de definição de objeto ODL
Suporte às construções semânticas do modelo de objeto ODMG
Independente de qualquer
linguagem de programação em particular
Linguagem de Consulta OQL
A linguagem de consulta de objeto OQL
Linguagem de consulta proposta para o modelo de objeto ODMG
Consultas OQL simples, pontos de entrada do banco de dados, e
Sintaxe:
select ... from ... where ... <estrutura>
Ponto de entrada:
objeto persistente nomeado
Variável de iteração:
define quando uma coleção é
Resultados de consulta e caminho
Resultado de uma consulta
Qualquer tipo expresso no modelo de objeto ODMG
OQL é ortogonal com relação à especificação de expressões de caminho
Atributos, relacionamentos e nomes de operação (métodos) podem ser usados um no lugar do outro dentro das expressões de caminho
Outros recursos da OQL
Consulta nomeada
Consulta OQL retorna uma coleção como seu resultado
Para retornar apenas um único
elemento, usar operador element
Outros recursos da OQL (cont.)
Condição de membro e
quantificação sobre uma coleção Operações especiais para coleção ordenada
Cláusula group by em OQL Cláusula having
Modelo Relacional Objeto SQL 1999
Extensões para SQL
Construtores de tipo
Especifica objetos complexos
Mecanismo para especificar a identidade de objeto
Encapsulamento de operações
Fornecido por meio do mecanismo de tipos definidos pelo usuário (UDTs)
Mecanismos de herança
Tipos definidos pelo usuário (UDT)
UDT sintaxe:
CREATE TYPE NOME_TIPO AS
Estruturas complexas para objetos
ROW TYPE
Criar diretamente um atributo
estruturado usando a palavra-chave ROW
Estruturas complexas para objetos
Tipo de array
Elementos de referência utilizando [ ]
Função CARDINALITY
Retorna o número atual de elementos em um array
Projeto conceitual de BDO
Diferenças entre o projeto conceitual do BDO e do BDR, é a manipulação de:
Relacionamentos Herança
Diferença filosófica entre o modelo
relacional e o modelo de objeto dos dados em relação à especificação comportamental
Incompatibilidades dos paradigmas
O modelo relacional é incompatível com o modelo de objetos (problema da impedância) quanto à:
Granularidade
Herança e polimorfismo Identidade
Associações
POO com SGBD Relacional
Caso o mapeamento seja manual, comandos SQL é embutido diretamente no código fonte das classes.
Viável para pequenas aplicações
Torna o código muito acoplado ao modelo de dados.
Mapeamento com Framework representa o estado da prática atual
Hibernate é um dos frameworks mais utilizados (implementação do JPA)
Mapeando um MR para BDO
Princípios básicos
Classes são mapeadas a tabelas
Instâncias (objetos) são mapeadas a
Mapeando um MR para BDO
conta correntista saldo
1 Gargantua 1370 2 Pantagruel 3450 3 Gargamel 800 4 Morticia 8200 Classe Conta String codigo String nome double saldo instância:Conta codigo="4" nome="Morticia" saldo=8200 Tabela Conta
Mapeando um MR para BDO
Crie uma classe ODL para cada tipo de entidade ER Inclua propriedades de relacionamento para cada relacionamento binário
Inclua operações apropriadas para cada classe
Uma classe ODL que corresponde a uma subclasse no esquema ER herda o tipo e os métodos de sua superclasse no esquema ODL
Mapeando um MR para BDO
Tipos de entidade fraca
Mapeados da mesma maneira que os tipos de entidade regulares
Relacionamentos multiplos
Mapeado para uma classe separada, com referências apropriadas a cada classe participante
Exemplo
O exemplo abaixo é simples
User: representa o usuário
BillingDetails: representa detalhes da cobrança
Exemplo
public class User {
private String userName; private String name;
private String address;
private Set billingDetails; // (get/set pairs), etc. ... }
create table USER (
USERNAME VARCHAR(15) NOT NULL PRIMARY KEY, NAME VARCHAR(50) NOT NULL,
ADDRESS VARCHAR(100) )
Exemplo
public class BillingDetails {
private String accountNumber; private String accountName; private String accountType; private User user;
//methods, get/set pairs... }
create table BILLING_DETAILS (
ACCOUNT_NUM VARCHAR(10) NOT NULL PRIMARY Key, ACCOUNT_NAME VARCHAR(50) NOT NULL,
ACCOUNT_TYPE VARCHAR(2) NOT NULL,
USER VARCHAR(15) FOREIGN KEY REFERENCES USER )
Incompatibilidades dos paradigmas
E se o usuário tiver um endereço? Deve ser uma nova tabela? ou coluna extras?
Problema: objetos podem ter vários níveis de granularidade, mas tabelas impõem limites
Tipos definidos pelo usuário: não é padrão em SQL Solução usual é colocar tudo na tabela USER
Incompatibilidades dos paradigmas
create table USER (
USERNAME VARCHAR(15) NOT NULL PRIMARY KEY, NAME VARCHAR(50) NOT NULL,
ADDRESS_STREET VARCHAR(50), ADDRESS_CITY VARCHAR(15), ADDRESS_STATE VARCHAR(15), ADDRESS_ZIPCODE VARCHAR(5), ADDRESS_COUNTRY VARCHAR(15) ) User Address
Incompatibilidades dos paradigmas
Problema mais complexo
Modelo relacional não suporta herança/polimorfismo
Associação polimórfica!
Incompatibilidades dos paradigmas
Queremos escrever consultas que referem-se à classe BillingDetails e retornar instâncias concretas dessa classe!
Associação polimórfica!
Incompatibilidades dos paradigmas
Problema da identidade
No mundo relacional, existe um critério de igualdade: chave-primária
No mundo Java há dois: Igualdade de referência (testado com ==) e equivalência (com equals()) Complicações adicionais
Chaves naturais Chaves compostas
Incompatibilidades dos paradigmas
Problema das Associações
Java representa associações como referências para objetos
São inerentemente direcionais Para implementar associações
bidirecionais, é preciso criar referências dos dois lados da associação
Referências dos dois lados podem ser associações M-N
Incompatibilidades dos paradigmas
Problema das Associações
No mundo relacional, associações são representadas por chaves estrangeiras Não são inerentemente direcionais
Pode-se criar associações arbitrárias com projeção e joins
Incompatibilidades dos paradigmas
Navegação em objetos
Pula-se de um objeto para outro: objeto.getA().getB() sem a definição de um caminho previamente definido
Equivalente a fazer um query para cada pulo (nó do grafo) Portanto, a forma mais natural de navegar entre objetos em Java é a forma menos eficiente de recuperar dados em SQL
Soluçao: usar joins para minimizar queries
Mapeamento com Framework de Persistência
Usar uma camada de persistência
para lidar com as
incompatibilidades dos paradigmas
Requer arquitetura com separação em camadas que concentram-se em um interesse predominante
Solução recomendada pelos padrões J2EE
Mapeamento com Framework de Persistência
Persistencia com JDBC
Criar uma camada de persistência usando JDBC. O padrão mais usado é o DAO – Data Access
Object
Isola todas as chamadas ao banco (SQL) em um
objeto e fornece uma API via interface para clientes Clientes são objetos de negócio que desconhecem a tecnologia de persistência usada
Persistencia com JDBC
Mas criar uma boa camada de persistência exige trabalho
É preciso implementar
eficientemente todo o SQL de acesso, relacionamentos,
atualização, etc. e integrar com APIs de transações, cache, etc
Exemplo de Framework de
Mapeamento Objeto-Relacional (ORM) Hibernate
Uma Solução de ORM normalmente oferece
Uma API para criação de objetos
Uma linguagem ou API de consultas
Um recurso para especificar meta dados de mapeamento
Gerenciamento de transações
Hibernate
O Hibernate é uma das soluções mais difundidas para Mapeamento OR em Java. (Outras também famosas são OJB, JDO e o Toplink).
Ele está sob a LGPL, ou seja, ele pode ser um usado em código aberto e projetos comerciais. Usam o Hibernate em seus projetos: Sony, AT&T, PwC, Cisco... entre outras empresas.
Mapeamento OR em Hibernate
O hibernate isola o aplicativo de contato
direto com o banco de dados, servindo como ponte entre os dois sistemas.
O hibernate não é intrusivo. Ou seja, ele não obriga o programado a estender uma classe dele no seu aplicativo.
Mapeamento OR em Hibernate
No Hibernate temos que criar um
arquivo de mapeamento que serve
como o modelo da persistência lógica. Hibernate monta um BD relacional
consistente para a estrutura OO dada. O arquivo de mapeamento é utilizado para os padrões de escrita e consulta.
Exemplo
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping>
<class name="org.applabs.base.User" table="USER">
<id column="USER_ID" name="id" type="java.lang.Long"></id> <property column="USER_NAME" name="userName" type=.../> <property column="USER_PASSWORD" name="userPassword" .../> <property column="USER_FIRST_NAME" name="userFirstName" .../> ...
<set name="properties" inverse="true"> <key column="USER_ID" />
<one-to-many class="org.applabs.base.UserProp" /> </set>
</class>
HQL (Hibernate Query Language)
Para fazer consultas ao banco o
Hibernate usa HQL, que é um dialeto OQL.
Ex:
select nome, price
from eg.CD as cd
Oracle OR 11g
Tipos de Objetos (TADs)
Nested Tables (Tabelas aninhadas) VArrays (Varying Arrays)
Large Objects (LOBs) References (REF)
Object View (Visão de Objetos)
No entanto, há algumas diferenças com o padrão SQL:1999
Oracle 11g
Suporta modelos:
Relacional – Padrão SQL 1992
Objeto-relacional - conceitos OO e estruturas como tipos de dados abstratos, nested tables e varying arrays.
Orientado a objetos - projeto é, desde o seu início, desenvolvido com análise orientada a objetos.
Esquema
Tipos de Objetos
Um Tipo de Objeto é um esquema de objeto com 3 componentes: Nome, Atributos, Métodos
Um tipo de objeto pode ser usado para:
Definir o domínio de atributos (“column object”) de tabelas
Definir o tipo dos atributos de TADs ( “embedded object”)
Tipos de Objetos
Um tipo de objeto em Oracle possui a seguinte estrutura:
Tipos de Objetos
Exemplo de especificação da interface pública de um objeto Sintaxe resumida:
CREATE [OR REPLACE] TYPE nome_tipo AS OBJECT (
[lista de atributos] [lista de métodos] );
Tipos de Objetos
Pode ser usado da mesma forma que é usado um tipo primitivo
-- em uma tabela
CREATE TABLE tb_contatos ( contato tp_pessoa,
dt_contato DATE );
CREATE TABLE tb_domicilio ( local tp_ponto,
Tipos de Objetos
Pode ser usado da mesma forma que é usado um tipo primitivo
-- em um Type
CREATE TYPE tp_contatos AS OBJECT ( contato tp_ pessoa,
dt_contato DATE );
CREATE TYPE tp_domicilio AS OBJECT ( local tp_ponto,
Tipos de objetos
create type ENDERECO_TYP as object (rua VARCHAR2(50),
cidade VARCHAR2(25), estado CHAR(2),
cep NUMBER);
create table PESSOAS (
nome VARCHAR2(25),
endereço ENDERECO_TYP
);
ENDEREÇO_TYP é usado para definir o tipo
Tipos de objetos
Não é possível ocorrer uma inserção de dados em
PESSOA_TYP. Isso porque um tipo de objeto descreve dados, mas não os armazena.
create type ENDERECO_TYP as object (rua VARCHAR2(50),
cidade VARCHAR2(25), estado CHAR(2),
cep NUMBER);
create type PESSOA_TYP as object
(nome VARCHAR2(25), endereco ENDERECO_TYP);
ENDEREÇO_TYP é usado para definir o tipo do atributo Endereco do
Tipos de objetos
Para armazenar dados é necessário a criação de uma tabela a partir de um tipo de objeto.
A tabela PESSOAS irá armazenar dados com a estrutura do tipo PESSOA_TY
create type PESSOA_TY as object ( Nome VARCHAR2(25),
CPF NUMBER,
Endereco ENDERECO_TY );
create table PESSOAS of PESSOA_TY
Exemplo com métodos
CREATE TYPE person_typ AS OBJECT ( idno NUMBER,
first_name VARCHAR2(20), last_name VARCHAR2(25), email VARCHAR2(25),
phone VARCHAR2(20),
MAP MEMBER FUNCTION get_idno RETURN NUMBER, MEMBER PROCEDURE details (SELF IN OUT NOCOPY person_typ)
Exemplo (cont.)
CREATE TYPE BODY person_typ AS
MAP MEMBER FUNCTION get_idno RETURN NUMBER IS BEGIN
RETURN idno; END;
MEMBER PROCEDURE details ( SELF IN OUT NOCOPY person_typ ) IS
BEGIN
-- use DBMS_OUTPUT package to display details DBMS_OUTPUT.PUT_LINE(TO_CHAR(idno) || ' ' || first_name || ' ' || last_name);
DBMS_OUTPUT.PUT_LINE(email || ' ' || phone); END;