Visualizar - Polis Educacional

Transcrição

Visualizar - Polis Educacional
Roberto Baselio Lopes
RA0502013 – 8º Semestre
ESTUDO COMPARATIVO DE IMPLEMENTAÇÃO DE
MODELOS DE BANCO DE DADOS
Jaguariúna
2008
2
Roberto Baselio Lopes
RA0502013 – 8º Semestre
ESTUDO COMPARATIVO DE IMPLEMENTAÇÃO DE
MODELOS DE BANCO DE DADOS
Monografia
apresentada
à
disciplina "Trabalho de Conclusão de
Curso", do curso de Ciência da
Computação
da
Faculdade
de
JAGUARIÚNA, sob orientação do
Professor Luciano Calderoni, como
exigência parcial para conclusão do
curso de graduação.
Jaguariúna
2008
3
LOPES, Roberto Baselio. Estudo comparativo de implementação de modelos de banco de
dados. Monografia defendida e aprovada na FAJ em 09 de dezembro de 2008 pela
banca examinadora constituída pelos professores:
________________________________
Prof. Luciano Calderoni
Professor Orientador - FAJ
________________________________
Prof. Fernando Augusto Zancheta
Professor FAJ
4
Dedico este trabalho a minha companheira,
que nos momentos mais difíceis esteve a meu
lado, a minha mãe, pelos esforços realizados em
me auxiliar, a meu professor orientador, pela
maneira como me conduziu na elaboração deste,
e acima de tudo a Deus, por ter me atendido e
guiado pelo caminho correto.
5
AGRADECIMENTOS
Começo por agradecer a minha atual namorada e futura companheira, pelos
sacrifícios realizados em prol de conclusão desta atividade.
A minha mãe Gécia Baselio, pelas restrições impostas a si mesma, a fim de me
auxiliar nesta missão.
Aos colegas Rafael Rodrigues Bueno, Renato Freire Ricardo, Rafael Barbosa
Camargo e Kleber Quilez, aos quais, com nossos acalorados debates e compartilhamento
de conhecimento, também impactaram no resultado deste trabalho.
E por último, mas certamente o mais importante, a meu professor orientador Luciano
Calderoni, por também acreditar em meu potencial, aceitando a tarefa de me orientar na
realização deste, canalizando e direcionando louvavelmente as minhas idéias e ações neste
projeto.
6
Eu acredito que não existem heróis.
A gente pode ter pessoas realmente espetaculares, por exemplo, figuras
espiritualizadas, religiosas, que são grandes modelos para a humanidade, mas na verdade,
todo mundo é igual.
Eu não acredito que eu tenha uma verdade a mais. E principalmente a juventude.
Se a juventude cair nesse erro de acreditar que sim, elas inevitavelmente vão acabar
descobrindo que o ídolo delas tem pés de barro.
(Renato Russo)
7
LOPES, Roberto Baselio. Estudo comparativo de implementação de modelos de banco
de dados, 2008. Monografia (Bacharelado em Ciência da Computação) – Curso de Ciência
da Computação da faculdade de Jaguariúna, Jaguariúna.
RESUMO
Com o advento da informática e sua utilização nas mais diversas finalidades, a
persistência de dados tornou-se um dos mais importantes pilares dos sistemas de
informações. Dentro deste contexto, garantir a integridade, a confiabilidade e a não
replicação de dados passou a ser o fundamento principal na implementação de sistemas
gerenciadores de bancos de dados. Diante desta realidade surgem vários modelos/métodos
de implantação de persistência de dados, sendo os mais empregados atualmente os bancos
de dados relacionais (SGDB), e mais especificamente ainda, os que se utilizam da
linguagem SQL. Com o grande avanço das linguagens de programação, surgiu a
necessidade de integrá-las aos bancos de dados, então surgiram camadas de persistências
que realizavam a comunicação com os bancos de dados através de drivers, tornando-os
genéricos e possíveis de serem aplicados a qualquer linguagem programação. Os exemplos
mais básicos são o JDBC ou o ODBC. Paralelamente, também surgiram os frameworks
facilitando a implementação das camadas de persistência. Em outra vertente, temos a
evolução das linguagens de programação orientada a objetos trazendo consigo os bancos
de dados orientados a objetos. Estes reduziram a necessidade do uso de drivers para
conexões e eliminou a manipulação de dados para torná-los compatíveis com modelo
relacional. O objetivo deste trabalho foi pesquisar as diferenças nas metodologias de
persistência de dados (SGDB nativo, framework, SGDBOO), nas operações de CRUD e
alguns dos principais recursos dos bancos de dados, as triggers, chaves primárias e
estrangeiras.
PALAVRAS CHAVES: Banco de dados, Framework, implementação, tecnologia.
8
ABSTRACT
With the advent of computers and their use in many different purposes, the persistence
of data has become one of the most important pillars of information systems. Inside of this
context, ensuring the integrity, reliability and no data replication has become the essential
foundation of system managers in the implementation of databases. Before this situation
arise various models / methods of implantation of data of persistence, as currently employed,
the relational databases (SGDB), and even more specifically, the ones which use SQL. With
the big breakthrough programming languages, came the need to integrate them to the
databases, then emerged categories of persistency held that the communication with the
databases through drivers, made generic possible to be applied to any programming
language. The most basic example the JDBC or ODBC, in addition, it also ederged the
frameworks facilitating the implementation of layers of persistence. Other side, we have the
evolution of programming language guided to objects bringing, the databases oriented to
object. These reduced the need for drivers for connections and dropped the manipulation of
data to make them compatible necessary in the relational model. The research aimed to find
differences in methods of data persistence (SGDB native, framework, SGDBOO), in CRUD
operations and some of the main resources of databases, the triggers, primary keys and
foreign keys.
KEY WORDS: Database, Framework, implementation, technology.
9
Sumario
LISTA DE SIGLAS ............................................................................................................... 11 LISTA DE CODIGOS FONTE.............................................................................................. 12 LISTA DE ILUSTRAÇÕES .................................................................................................. 13 LISTA DE TABELAS............................................................................................................ 14 1. INTRODUÇÃO.............................................................................................................. 15 1.1. Objetivos ......................................................................................................... 15 1.2. Metodologia .................................................................................................... 16 1.3. Cronograma .................................................................................................... 16 1.4. Capítulos ......................................................................................................... 17 2. MODELOS DE IMPLANTAÇÃO ................................................................................... 18 2.1. Modelo Relacional .......................................................................................... 18 2.1.1. Etapas da implementação banco relacional........................................ 20 2.2. Framework ...................................................................................................... 20 2.2.1. Etapas da implementação banco via framework................................. 21 2.3. Modelo Orientado a objeto ............................................................................. 21 2.3.1. Etapas da implementação banco orientado a objeto. ......................... 23 3. SOBRE OS BANCOS DE DADOS E FRAMEWORKS ................................................ 24 3.1. PostgreSQL .................................................................................................... 24 3.2. Hibernate ........................................................................................................ 24 3.3. DB4o ............................................................................................................... 25 4. CONCEITOS ................................................................................................................ 27 4.1. UML ................................................................................................................ 27 4.2. XML ................................................................................................................ 27 4.3. DER ................................................................................................................ 28 4.4. JDBC .............................................................................................................. 28 4.5. Operações de CRUD ...................................................................................... 29 5. ESTUDO DE CASO...................................................................................................... 30 5.1. Relacionamentos e Operações de CRUD ...................................................... 31 5.1.1. PostgreSQL (modelo relacional) ......................................................... 31 5.1.2. Hibernate (framework)......................................................................... 33 5.1.3. DB4o (orientado à objeto) ................................................................... 37 5.2. Índices e chaves ............................................................................................. 40 5.2.1. PostgreSQL ......................................................................................... 41 5.2.2. Hibernate ............................................................................................. 41 5.2.3. BD4o ................................................................................................... 41 5.3. Procedures e Triggers .................................................................................... 42 10
5.4. Desempenho .................................................................................................. 42 5.4.1. Ambiente ............................................................................................. 42 5.4.2. Metodologia ......................................................................................... 42 5.4.3. Resultados .......................................................................................... 43 6. RESULTADOS OBTIDOS ............................................................................................ 44 6.1. Comparativo de características ...................................................................... 45 7. BIBLIOGRAFIA ............................................................................................................. 46 11
LISTA DE SIGLAS
ANSI-
American National Standards Institute;
CRUD-
Acrônimo da expressão em língua Inglesa Create, Retrieve, Update e Destroy,
usada para definir quatro operações básicas usadas em bancos de dados
relacionais;
DAO-
Data Acess Object;
DBA-
DataBase Administrator;
DB4o-
DataBase for Object;
DBOO-
Banco de dados orientado a objeto;
HQL-
Hibernate Query Language;
JAVA/SE-
Java Standard Edition;
JDBC-
Java Database Connectivity;
DER-
Diagrama Entidade-Relacionamento;
ODBC-
Open Data Base Connectivity;
ODMG-
Object Database Management Group;
OO-
Orientação à Objeto;
RDBMS-
Relational database management system
SIG-
Sistema de Informação Geográfica;
SGDB-
Sistema Gerenciador de Banco de Dados;
SGDBOO-
Sistema Gerenciador de Banco de Dados Orientado a Objeto;
SGDBR-
Sistema Gerenciador de Banco de Dados Relacional;
SQL-
Structured Query Language;
UML-
Unified Modeling Language;
XML-
eXtensible Markup Language;
12
LISTA DE CODIGOS FONTE
Código Fonte 1: Operação de CRUD via SQL ............................................................. 29
Código Fonte 2: Classes a serem persistidas .............................................................. 30
Código Fonte 3: Comando SQL para criação das tabelas ........................................... 31
Código Fonte 4: Classe para conexão com SGDBR via JDBC ................................... 32
Código Fonte 5: Classe para persistência de dados via JDBC .................................... 33
Código Fonte 6: Arquivo XML para configuração da conexão via Hibernate ............... 34
Código Fonte 7: Classe que realiza a conexão com banco via Hibernate ................... 35
Código Fonte 8: Arquivo XML de mapeamento da classe proprietário ........................ 35
Código Fonte 9: Arquivo XML de mapeamento da classe veículo ............................... 36
Código Fonte 10: Operações de CRUD via Hibernate ................................................. 37
Código Fonte 11: Classe de conexão com bando de dados OO ................................. 38
Código Fonte 12: Classe cliente relacionada coma classe veiculo .............................. 39
Código Fonte 13: Operações de CRUD via DB4o. ...................................................... 40
Código Fonte 14: exemplo de declaração de chave primaria ...................................... 41
13
LISTA DE ILUSTRAÇÕES
Ilustração 1: Exemplo de relacionamento .................................................................... 19
Ilustração 2: Exemplo de DER ..................................................................................... 19
Ilustração 3: Exemplo DER 1:1 .................................................................................... 19
Ilustração 4: Exemplo DER 1:N.................................................................................... 19
Ilustração 5: Exemplo DER N:N ................................................................................... 20
Ilustração 6: Manipulação de dados via framework ..................................................... 21
Ilustração 7: Comparação de manipulação de dados ente SGBDR e SGBDOO ........ 22
Ilustração 8: Diagrama de classe para implementação de base de dado OO ............. 23
Ilustração 9: DER das classes a serem persistidas ..................................................... 31
14
LISTA DE TABELAS
Tabela 1: Cronograma de atividades ........................................................................... 16
Tabela 2: Comparativo entre implementações............................................................. 43
Tabela 3: Comparativo entre modelos de implementação ........................................... 45
15
1. INTRODUÇÃO
O termo banco de dados foi criado inicialmente pela comunidade de computação, para
indicar coleções organizadas de informações armazenadas em computadores, porém o
termo é atualmente usado para indicar tanto bancos de dados em computadores quanto
coleções de dados em geral.
Aceitando uma abordagem mais técnica, um banco de dados é uma coleção de
registros salvos em um computador em um modo sistemático, de forma que um programa
de computador possa consultá-lo para responder questões.
Um banco de dados é usualmente mantido e acessado por meio de um software
conhecido como Sistema Gerenciador de Banco de Dados (SGBD). Normalmente um SGBD
adota um modelo de dados, de forma pura, reduzida ou estendida. Muitas vezes o termo
banco de dados é usado como sinônimo de SGDB.
O termo banco de dados deve ser aplicado apenas aos dados, enquanto o termo
SGDB deve ser aplicado ao software com a capacidade de manipular bancos de dados de
forma geral. Porém, é comum misturar os dois conceitos.
O primeiro SGBD surgiu no final de 1960 tendo como motivação os primitivos sistemas
de arquivos disponíveis na época, estes sistemas não controlavam acessos concorrentes
nem replicação de dados dentro do SGDB. Com o tempo, os SGBDs passaram a utilizar
diferentes formas de representação para descrever a estrutura das informações contidas em
seus bancos de dados. Atualmente, os seguintes modelos de dados são normalmente
utilizados pelos SGBDs: hierárquico, em redes, relacional (amplamente usado) e o orientado
a objetos.
Com a evolução dos ERPs modernos, os bancos de dados se tornaram o fator
principal nas tomadas de decisões, fazendo da figura do DBA (database administrator), uma
peça chave no controle das informações e na integridade do banco de dados.
Mas com o surgimento, ou melhor, com a evolução dos vários paradigmas de
persistência, sendo hoje em dia o relacional e o orientado a objetos os mais evidentes,
surge à grande questão, qual paradigma é o mais recomendado.
1.1. Objetivos
Segundo Gláucio Guerra (http://glaucioguerra.wordpress.com/2007/09/05/banco-dedados-orientado-a-objetos-dbo4/, mai. 2008).
No mercado existem diversos tipos de banco de dados orientados a objetos
como o NeoDatis, ObjectDB, MyOODB e o db4o que foram escritos em Java. Dentre
eles, escolhi o db4o para trabalhar em um projeto de um sistema com mais ou
menos 50 usuários, sendo no máximo 5 com uso simultâneo. Era um projeto
relativamente pequeno, curto prazo de entrega e sem muita complexidade de
modelagem. O que dificultava um pouco era o prazo que era muito curto mesmo.
16
O db4o foi perfeito neste caso, evitei toda aquela configuração de
mapeamento objeto-relacional com o Hibernate, não precisei falar com o DBA para
criar um schema no Oracle me livrando de toda a burocracia que é inevitável na
maioria das vezes.
Com o intuito de analisar esta afirmação, este trabalho tem o objetivo de disponibilizar
um benchmark aos interessados quanto à qual modelo de persistência de dados resulta
numa maior produtividade.
Comparando os modelos de implementação Sistema
Gerenciador de Banco de Dados Relacional (SGDBR), Sistema Gerenciador de Bando de
Dados Orientado à objeto (SGDBOO) e utilizando um framework para um SGDBR.
Outros objetivos secundários são:
•
Disponibilizar informações sobre o funcionamento das tecnologias;
•
Disponibilizar comparativos entre modelos de implementação.
1.2. Metodologia
Através
de
pesquisa,
serão
avaliadas
as
características
dos
modelos
de
implementação, bem como suas particularidades, focando os produtos PostgreSQL para
banco de dados relacional, Hibernate para framework e DB4o para banco de dados
orientado a objeto.
A escolha destes produtos deve-se principalmente a suas características “opensource”, não resultando em custos extras no caso de implantação física.
1.3. Cronograma
Atividade
Mar
Abr
Mai
Jun.
Jul.
Ago.
Set
Out.
Nov.
Levantamento Bibliográfico
OK
OK
OK
OK
OK
OK
OK
OK
OK
Preparação do ambiente de desenvolvimento
OK
Implantação do programa base
OK
Implantação das tecnologias de persistência
OK
Testes
OK
OK
Correção de Divergências
OK
OK
OK
OK
Coleta de resultados preliminares
Compilação do relatório inicial
OK
OK
OK
OK
Análise dos Resultados
OK
OK
Entrega do trabalho
Tabela 1: Cronograma de atividades
OK
17
1.4. Capítulos
CAPÍTULO 1 – Neste capítulo consta uma pequena introdução sobre o tema, os
objetivos que se pretende atingir com este trabalho, a metodologia adotada na pesquisa e o
cronograma de atividades.
CAPÍTULO 2 – Neste capítulo são abordados os conceitos dos modelos de
persistência de dados, bem como as etapas recomendadas para tal implementação.
CAPÍTULO 3 – Neste capítulo temos uma breve descrição dos bancos de dados e
framework selecionados para a pesquisa deste trabalho.
CAPÍTULO 4 – Neste capítulo consta uma breve explanação sobre as tecnologias e
conceitos necessários para a implementação dos bancos de dados selecionados.
CAPÍTULO 5 – Neste capítulo consta um estudo de caso onde é minimamente
implementado um banco de dados nos três modelos de persistência propostos, a fim de se
obter um panorama geral de cada modelo.
CAPÍTULO 6 – Neste ponto estão descritas as conclusões, com base na análise do
estudo de caso.
CAPÍTULO 7 – Aqui são descritos os livros e sites pesquisados.
18
2. MODELOS DE IMPLANTAÇÃO
Existem vários modelos de implementação de banco de dados, abaixo teremos os
conceitos dos modelos focos de estudos desta monografia: o modelo relacional, o orientado
à objeto e uma introdução ao conceito do framework como ferramenta auxiliar de
persistência de dados.
2.1. Modelo Relacional
O modelo relacional é uma teoria matemática desenvolvida por Edgar Frank Codd
(1970), que descreve como as bases de dados devem funcionar. Embora esta teoria seja a
base para o software de bases de dados relacionais, poucos sistemas de gestão de bases
de dados seguem o modelo de forma restrita, a maioria apresenta funcionalidades que
violam a teoria, variando assim em poder e complexidade. A discussão se esses bancos de
dados merecem ser chamados de relacional ficou esgotada com tempo e foi padronizada
pela arquitetura ANSI / SPARC em três níveis de componentes:
•
uma coleção de estruturas de dados, formalmente chamadas de relações, ou
informalmente tabelas;
•
uma coleção dos operadores, a álgebra e o cálculo relacionais, que constituem
a base da linguagem SQL;
•
uma coleção de restrições da integridade, definindo o conjunto consistente de
estados de base de dados e de alterações de estados. As restrições de
integridade podem ser de quatro tipos: o domínio (ou tipo de dados), o atributo,
o relvar (variável de relacionamento) e restrições de base de dados.
O modelo relacional atende as necessidades de aumentar a independência de dados
nos sistemas gerenciadores de banco de dados; provendo um conjunto de funções apoiadas
na álgebra relacional para persistência e recuperação de dados, se mostrando mais flexível
e adequado ao solucionar os vários problemas que surgem na concepção e implementação
da base de dados.
Um dos pontos fortes do modelo relacional de banco de dados proposto por Edgar é a
possibilidade de definição de um conjunto de restrições de integridade. Estas definem os
estados e mudanças de estado, determinando os valores que podem e os que não podem
ser armazenados.
Outro ponto forte são os relacionamentos propriamente ditos, tendo como estrutura
básica uma tabela para cada entidade. Os relacionamentos são construídos pelos atributos
em comum nas entidades, logo algumas restrições precisaram ser impostas para evitar
aspectos indesejáveis, como: Replicação de informação, incapacidade de representar parte
da informação e perda de informação. Essas restrições são: integridade referencial, chaves
19
e integridade de junções de relações. As figuras a seguir, mostram como ocorre o
relacionamento entre tabelas.
Ilustração 1: Exemplo de relacionamento
Ilustração 2: Exemplo de DER
No exemplo acima se pode identificar que o Cliente Pedro ocupa o quarto simples, e o
Cliente Paulo ocupa o quarto de casal.
Outras características dos relacionamentos é seu tipo, que tem a função de indicar
como ocorre este relacionamento:
O relacionamento pode ser dos tipos:
•
1:1 (um para um) – Exemplo: casamento, onde um marido pode possuir
apenas uma esposa e uma esposa apenas um marido.
Ilustração 3: Exemplo DER 1:1
•
1:N (um para ene) – Exemplo: Veiculo automotor, onde um veículo pode
possuir apenas um proprietário, mas um proprietário pode possuir vários
veículos.
Ilustração 4: Exemplo DER 1:N
20
•
N:N (ene para ene) – Exemplo quarto de hotel, onde um quarto pode ser
alugado por varias pessoas e uma pessoa pode alugar vários quartos.
Ilustração 5: Exemplo DER N:N
2.1.1. Etapas da implementação banco relacional.
O processo de criação de uma base dados consiste em:
•
Elaborar um modelo de entidade relacionamento DER;
•
Criação das tabelas no banco de dados;
•
Definição dos relacionamentos;
•
Criação dos objetos que serão persistidos;
•
Criação de classe/função de conexão com o banco de dados;
•
Criação da classe/função que vai persistir o objeto
2.2. Framework
“Framework é um conjunto de classes que colaboram para realizar uma
responsabilidade para um domínio de um subsistema da aplicação”
Mohamed Fayad e Douglas C. Schimidt (Object-oriented application frameworks , 1997)
Em computação, um framework pode ser definido como uma estrutura de suporte
definida em que outro projeto de software pode ser organizado e desenvolvido. Um
framework pode incluir programas de suporte, bibliotecas de código, linguagens de script e
outros softwares para ajudar a desenvolver e juntar diferentes componentes de um projeto
de software.
Frameworks são projetados com a intenção de facilitar o desenvolvimento dos projetos
software, reduzindo teoricamente o tempo de implantação, sendo que se diferencia de uma
simples biblioteca, uma vez que se concentra apenas em oferecer implementação de
funcionalidades.
21
A sua utilização para persistência de dados consiste numa camada intermediária que
oculta as operações realizadas diretamente no banco, já que no SGDBR o objeto deve ser
“desmontado” na inserção, e “reconstruído” na recuperação,
Inserção
recuperação
Ilustração 6: Manipulação de dados via framework
A utilização de um framework de persistência de dados tende a facilitar esta atividade
de “desmontar” e reconstruir. A motivação para o uso de frameworks de persistência é ter
um mecanismo simples para persistência de objetos com bancos de dados SQL,
mapeamento automático, ou semi-automático, construção de consultas através da
montagem de protótipos, foco em OO.
2.2.1. Etapas da implementação banco via framework
O processo de criação de uma base de dados consiste basicamente em:
•
Elaborar um modelo de entidade relacionamento DER;
•
Criação das tabelas no banco de dados onde serão persistidos os dados
•
Criação dos objetos que serão persistidos;
•
Criação do mapeamento (geralmente em XML) relacionando as propriedades
do objeto aos campos na tabela
•
Criação do arquivo de propriedades para que o Hibernate se conecte ao banco
de dados;
•
Criação da classe que vai persistir o objeto
2.3. Modelo Orientado a objeto
Segundo José Carlos Macoratti (http://www.macoratti.net/net_oocb.htm, abr. 2008), a
orientação a objetos, também é conhecida como um paradigma de análise, projeto e
programação de sistemas baseado na composição e interação entre diversas unidades de
software chamadas de objetos.
22
Em alguns contextos, prefere-se usar modelagem orientada ao objeto, em vez de
projeto. Juntamente com o avanço da linguagem de programação orientadas a objeto,
surgiram os bancos de dados propostos nos mesmo paradigmas.
Os bancos de dados orientados a objeto (DBOO) começaram a se tornar
comercialmente viáveis em meados de 1980. Seu surgimento se deve aos limites de
armazenamento e representação semântica impostas no modelo relacional. Alguns
exemplos são os sistemas de informações geográficas, que são mais facilmente construídos
usando tipos complexos de dados.
A estrutura padrão para os DBOO foi feita pelo Object Database Management Group
(ODMG). Esse grupo é constituído por representantes dos principais fabricantes de DBOO e
seus membros têm o compromisso de incorporar o padrão em seus produtos. O termo
Modelo Orientado a Objetos é usado para documentar o padrão que contém a descrição
geral das facilidades de um conjunto de linguagens de programação orientadas a objetos e
a biblioteca de classes que pode formar a base para o SGDBOO. Quando os DBOO foram
introduzidos, algumas das falhas perceptíveis do modelo relacional pareceram ter sido
solucionadas com esta tecnologia e acreditava-se que tais bancos de dados ganhariam
grande parcela do mercado. Hoje, porém, acredita-se que os DBOO serão usados em
aplicações especializadas, enquanto os sistemas relacionais continuarão a sustentar os
negócios tradicionais, onde as estruturas de dados baseadas em relações são suficientes.
A principal característica de um BDOO e a forma como ele persiste os dados. Como
mencionado anteriormente, o modelo relacional precisa “desmontar” o objeto, o DBOO salva
o objeto diretamente no banco.
Ilustração 7: Comparação de manipulação de dados ente SGBDR e SGBDOO
Na fase de projeto de um DBOO podem ser utilizados os diagramas de classes em
UML em substituição ao DER no banco de dados relacional. Na figura abaixo temos um
digrama de um DBOO.
23
Ilustração 8: Diagrama de classe para implementação de base de dado OO
2.3.1. Etapas da implementação banco orientado a objeto.
Para a criação de banco de dados orientado a objetos são necessários os seguintes
passos:
•
Elaboração da UML ou DER das classes persistidas;
•
Criação do objeto que será persistido;
•
Definição dos relacionamentos;
•
Criação da classe que vai persistir o objeto;
24
3. SOBRE OS BANCOS DE DADOS E FRAMEWORKS
Muitos bancos de dados comercialmente viáveis estão disponíveis para uso. Neste
capitulo abordaremos os softwares e frameworks que são foram utilizados nesta monografia.
3.1. PostgreSQL
O PostgreSQL é uma derivação do projeto POSTGRES da universidade de Berkeley,
cuja última versão foi a 4.2. O POSTGRES foi originalmente financiado pelo DARPA
(Agência de Projetos de Pesquisa Avançada para Defesa), ARO (Departamento de
Pesquisa Militar), NSF (Fundação Científica Nacional) e ESL Inc. A implementação do
projeto POSTGRES iniciou em 1986, e em 1987 tornou-se operacional. A primeira versão
lançada para o público externo foi em 1989.
Em 1991 era lançada a versão 3, com
melhorias no executor de consultas e algumas partes do código foram refeitas. As versões
subseqüentes, até o Postgres95, foram focadas em confiabilidade e portabilidade. O
POSTGRES foi utilizado para diversos sistemas de pesquisa e de produção, uma aplicação
de análise financeira, um banco com rotas de asteróides, e diversos sistemas de
informações geográficas. O código do POSTGRES foi aproveitado em um produto
comercializado pela Illustra Information Technologies (posteriormente incorporada à
Informix, que agora pertence à IBM).
A versão 95 (Postgres95) teve mudanças radicais em relação ao projeto original. O
seu código foi totalmente revisado, o tamanho do código fonte foi reduzido em 25%, e a
linguagem SQL foi implementada. O desempenho foi melhorado e vários recursos foram
adicionados. Em 1996 o nome Postgres95 tornou-se inadequado, o projeto foi rebatizado
"PostgreSQL", para enfatizar a relação do POSTGRES original com a linguagem SQL. A
numeração da versão voltou a seguir o padrão anterior ao Postgres95 (considerada a 5.0), e
a primeira versão do PostgreSQL foi a 6.0. Enquanto a ênfase do Postgres95 tinha sido a
correção de falhas e otimização do código, o desenvolvimento das primeiras versões do
PostgreSQL foi orientada à melhoria de recursos e implementação de novos recursos,
sempre seguindo os padrões de SQL anteriormente estabelecidos
3.2. Hibernate
Hibernate foi criado por desenvolvedores Java, espalhados ao redor do mundo, e
liderado por Gavin King. Posteriormente, JBoss Inc (empresa comprada pela Red Hat)
contratou os principais desenvolvedores do programa para fazer o seu suporte.
Por: José Claudio Vahl Júnior e Marcílio da Silva Oliveira em Uma introdução dirigida
(2005) dizem que
“O Hibernate é uma solução livre para armazenar objetos
Java
em
bases
de
dados
relacionais (Object/Relational Mapping -
25
ORM). Além de mapear as classes Java para as tabelas do banco de
dados, o Hibernate também possui uma linguagem (HQL) que facilita a
recuperação dos dados evitando esforços com manipulação direta de SQL e
JDBC”
O objetivo do Hibernate é diminuir a complexidade entre os programas Java, baseado
no modelo orientado a objeto, que precisam trabalhar com um SGBDR. O Hibernate abstrai
geração das chamadas SQL e libera o desenvolvedor do trabalho manual da conversão dos
dados resultantes, mantendo o programa portável para quaisquer bancos de dados SQL, em
contrapartida (segundo estudos), causa um pequeno aumento no tempo de execução.
Hibernate pode ser utilizado em aplicações Java standalone ou em aplicações Java
EE, utilizando servlet ou sessões EJB beans.
Uma característica do Hibernate é o uso da HQL (Hibernate Query Language) que é
um dialeto SQL para o Hibernate. Ela é uma poderosa linguagem de consulta que se parece
muito com a SQL, mas a HQL é totalmente orientada a objeto, incluindo os paradigmas de
herança, polimorfismo e encapsulamento.
3.3. DB4o
No mercado existem diversos tipos de banco de dados orientados a objetos como o
NeoDatis, ObjectDB, MyOODB e o db4o que foram escritos em Java.
O db4o é um banco de dados inteiramente orientado a objetos, podendo ser utilizado
em aplicações do tipo embarcada, cliente-servidor e desktop. Este SGDB permite
armazenar classes Java diretamente no banco, sem precisar utilizar consultas SQL ou
qualquer tipo de framework que faça o mapeamento objeto-relacional.
Empresas como a Bosch, Hertz, BMW, Intel, Seagate entre outras, já utilizam o db4o.
São inúmeras as vantagens em relação ao banco de dados relacional: a ferramenta é nativa
em Java (ou .Net), oferece rapidez de inserção e consulta, utiliza pouco recurso
computacional, tem fácil aprendizado, não possui nenhuma linha de código SQL para CRUD
(Create, Read, Update e Delete).
Em seu artigo, Gláucio Guerra (http://glaucioguerra.wordpress.com/2007/09/05/bancode-dados-orientado-a-objetos-dbo4/, mai. 2008), comenta.
Posso dizer que minha experiência foi muito boa com este BDOO com os
seguintes parâmetros:
•
Pouca concorrência
•
Baixa complexidade no DER
•
Sincronização com PDA
26
A principal característica do DB4o, disponibilizada pelo site PolePosition que é um
projeto open-source para Benchmark de banco de dados (http://www.polepos.org/, mai
2008). Este banco roda até 44 vezes mais rápido que os BDs que já conhecemos.
27
4. CONCEITOS
Ao longo desta monografia são abordados alguns termos e nomenclaturas, portanto,
abaixo temos descritos os principais conceitos necessários para a persistência de dados.
4.1. UML
A Unified Modeling Language (UML) é uma linguagem de modelagem não proprietária
de terceira geração. A UML não é uma metodologia de desenvolvimento, mas ela auxilia a
visualizar o desenho e a comunicação entre objetos.
Os esforços para a criação da UML tiveram início em outubro de 1994, quando
Rumbaugh se juntou a Booch na Rational. Com o objetivo de unificar os métodos Booch e
OMT, decorrido um ano de trabalho, foi lançado, em outubro de 1995, o esboço da versão
0.8 do Método Unificado (como era conhecido). Nesta mesma época, Jacobson se associou
à Rational e o escopo do projeto da UML foi expandido para incorporar o método OOSE.
Nasceu então, em junho de 1996, a versão 0.9 da UML.
É importante distinguir entre um modelo UML e um diagrama UML, o último é uma
representação gráfica da informação do primeiro, mas o primeiro pode existir
independentemente.
Hoje em dia o uso da UML faz parte das “boas práticas de engenharia", pretendendo
ser a linguagem de modelagem padrão para modelar sistemas concorrentes e distribuídos.
Kris
Richards
e
Cindy
Castillo,
no
artigo
“Why
Model
With
UML?”
(http://www.netbeans.org/kb/55/uml-why-model.html, jun. 2007), dizem.
O propósito da Linguagem de Modelagem Unificada (Unified Modeling
Language - UML) é prover uma notação de modelagem independente de linguagem
de programação e de plataforma. Ferramentas UML são tão versáteis quanto os
fundamentos de UML.
4.2. XML
O XML (eXtensible Markup Language)
foi estimulado pela insatisfação com os
formatos existentes (padronizados ou não), o World Wide Web Consortium (W3C) começou
a trabalhar em meados da década de 1990 em uma linguagem de marcação que
combinasse a flexibilidade da SGML com a simplicidade da HTML. O principio do projeto era
criar uma linguagem que pudesse ser lida por software, e integrar-se com as demais
linguagens. Sua filosofia seria incorporada por vários princípios importantes:
•
Separação do conteúdo da formatação;
•
Simplicidade e Legibilidade, tanto para humanos quanto para computadores;
•
Possibilidade de criação de tags sem limitação;
28
•
Criação de arquivos para validação de estrutura (Chamados DTDs);
•
Interligação de bancos de dados distintos;
•
Concentração na estrutura da informação, e não na sua aparência;
O XML é considerado um bom formato para a criação de documentos com dados
organizados de forma hierárquica, como se vê freqüentemente em documentos de texto
formatados, (properties). Essa característica permite, por exemplo, que um banco de dados
possa através de uma aplicação escrever em um arquivo XML, e outro banco distinto possa
ler então estes mesmos dados.
4.3. DER
Diagrama entidade relacionamento é um modelo diagramático que descreve o modelo
de dados de um sistema com alto nível de abstração. Ele é a principal representação do
Modelo de Entidades e Relacionamentos. Sua maior aplicação é para visualizar o
relacionamento entre tabelas de um banco de dados, no qual as relações são construídas
através da associação de um ou mais atributos destas tabelas.
4.4. JDBC
Java Database Connectivity ou JDBC é um conjunto de classes e interfaces (API)
escritas em Java que faz o envio de instruções SQL para qualquer banco de dados
relacional; API de baixo nível e base para APIs de alto nível; Amplia o que você pode fazer
com Java; Possibilita o uso de bancos de dados já instalados; Para cada banco de dados há
um driver JDBC que pode cair em quatro categorias:
•
Ponte JDBC-ODBC: É o tipo mais simples, mas restrito à plataforma Windows.
Utiliza ODBC para conectar-se com o banco de dados, convertendo métodos
JDBC em chamadas às funções do ODBC. Esta ponte é normalmente usada
quando não há um driver puro - Java (tipo 4) para determinado banco de
dados, pois seu uso é desencorajado devido à dependência de plataforma.
•
Driver API-Nativo: O driver API-Nativo traduz as chamadas JDBC para as
chamadas da API cliente do banco de dados usado. Como a Ponte JDBCODBC, pode precisar de software extra instalado na máquina cliente.
•
Driver de Protocolo de Rede: Traduz a chamada JDBC para um protocolo de
rede independente do banco de dados utilizado, que é traduzido para o
protocolo do banco de dados por um servidor. Por utilizar um protocolo
independente, pode conectar as aplicações clientes Java a vários bancos de
dados diferentes. É o modelo mais flexível.
29
•
Driver nativo: Converte as chamadas JDBC diretamente no protocolo do
banco de dados. Implementado em Java, normalmente é independente de
plataforma e escrito pelos próprios desenvolvedores. É o tipo mais
recomendado para ser usado.
4.5. Operações de CRUD
CRUD é o acrônimo da expressão em língua Inglesa Create, Retrieve, Update e
Delete, usada para definir quatro operações básicas usadas em bancos de dados
relacionais (RDBMS) ou em interface para usuários para criação, consulta, atualização e
destruição de dados.
As operações CRUD também são relevantes em interfaces para usuários de vários
níveis. Por exemplo, em um programa de Catálogo de Endereços, uma entrada de um
contato individual pode ser considerada a unidade básica de persistência. Em SQL os
comandos podem ser resumidos em:
CREATE TABLE 'tabela'
‘campo1’,
‘campo2’,
‘campo3’,
);
(
INSERT INTO 'tabela' ('campo1','campo2','campo3'...) VALUES
('valor1','valor2','valor3'...);
DELETE FROM 'tabela' WHERE 'condição';
UPDATE 'tabela'
SET 'campo1'= 'valor' WHERE 'condição';
Código Fonte 1: Operação de CRUD via SQL
30
5. ESTUDO DE CASO
Partindo de um problema básico, como “Cadastro de Veículos” e considerando apenas
dois objetos, o proprietário e o veículo, teremos as duas classes Java abaixo:
public class Proprietario {
private int id = 0;
private String nome = null;
public class Veiculo {
private String placa = null;
private String modelo = null;
public Proprietario(int id,
String nome){
super();
this.id = id;
this.nome = nome;
}
public Veiculo(String placa,
String modelo){
super();
this.placa = placa;
this.modelo = modelo;
}
public int getId(){
return id;
}
public String getPlaca() {
return placa;
}
public void setId(int id){
this.id = id;
}
public void setPlaca(String placa){
this.placa = placa;
}
public String getNome(){
return nome;
}
public String getModelo() {
return modelo;
}
public void setNome(String nome){
this.nome = nome;
}
public void setModelo(String modelo){
this.modelo = modelo;
}
}
}
Código Fonte 2: Classes a serem persistidas
Para o exemplo serão consideradas também as seguintes premissas
•
Cada carro possui um proprietário
•
Cada proprietário possui um ou mais carros.
Teremos então os processos abaixo divididos para cada um dos bancos, levando em
conta as etapas de implementação proposta no capítulo referente aos modelos de
implantação e utilizando as tecnologias selecionadas.
31
5.1. Relacionamentos e Operações de CRUD
5.1.1. PostgreSQL (modelo relacional)
De acordo com o problema exposto acima temos um relacionamento de 1:N que pode
ser representado pelo seguinte DER:
Ilustração 9: DER das classes a serem persistidas
Com base neste modelo, temos o seguinte código SQL para criação das tabelas no
banco:
CREATE TABLE Proprietario (
ID INTEGER NOT NULL
, Nome CHAR(30)
);
CREATE TABLE Veiculo (
Placa CHAR(7) NOT NULL
, Modelo CHAR(20)
, ID INTEGER NOT NULL
);
ALTER TABLE Proprietario
ADD CONSTRAINT PK_PROPRIETARIO
PRIMARY KEY (ID);
ALTER TABLE Veiculo
ADD CONSTRAINT PK_VEICULO
PRIMARY KEY (Placa);
ALTER TABLE Veiculo
ADD CONSTRAINT FK_Veiculo_1
FOREIGN KEY (ID)
REFERENCES Proprietario (ID);
Código Fonte 3: Comando SQL para criação das tabelas
Nesta etapa de criação já é possível identificar um dos primeiros pilares dos bancos
de dados, que é o relacionamento. Como já explicado anteriormente, ele serve para mostrar
alguma característica de relação com outra entidade. Para implementar isso o modelo
relacional faz uso do conceito de chave estrangeira, que consiste basicamente em
relacionar uma entidade conhecida e um atributo de outra entidade.
32
Definido o objeto a ser persistido e criadas as tabelas, os próximos passos ocorrem na
linguagem de programação selecionada, que consiste na conexão entre a linguagem e o
banco de dados.
Para se conectar ao PostgreSQL existem várias formas, pois se trata de um banco de
dados independente de sistema operacional possuindo versões Linux e Windows®.
As mais comuns são:
ODBC – Conexão disponível no Windows®.
JDBC – Conexão disponível para programas em Java.
Uma vez que nesta apresentação estamos focados no desenvolvimento em Java,
utilizaremos esta última como exemplo de conexão com o banco.
Abaixo podemos verificar o código fonte de uma classe Java que retorna um
statement para manipulação de dados em SQL.
public class Conec(){;
private static Statement stmt = null;
private static ADOconection conexao = null;
public Statement getADOconection() {
if (stmt == null){
try {
Class.forName("org.postgresql.Driver");
Connection con = DriverManager.getConnection(
"jdbc:postgresql://localhost/TCCpostgre:5432",
"postgres",
"shaman");
stmt = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
}
catch (Exception exc) {
System.out.println(exc.toString());
}
}
return stmt;
}
}
Código Fonte 4: Classe para conexão com SGDBR via JDBC
Neste código, podemos identificar 3 elementos básicos:
•
Primeiro: o nome do driver “Class.forName” que indica qual driver será utilizado,
no caso de um driver JDBC cada fabricante de banco de dados é responsável
por implementar uma série de classes determinadas para o padrão JDBC, por
isso este nome pode variar muito de banco para banco;
33
•
Segundo: são as três Strings de conexão “DriverManager.getConnection”
sendo elas o endereço do serviço (IP) e nome da base de dados, o nome do
usuário e por fim a senha de conexão;
•
Terceiro: é o elemento statement, ele é o objeto responsável por manipular os
comandos em SQL.
Uma vez estabelecida uma conexão com o banco (como visto anteriormente), é
possível executar os comandos SQL no banco de dados.
Abaixo temos um exemplo de como poderíamos executar esta operação diretamente
no banco através apenas da conexão JDBC.
public Proprietario operacaoSelect(){
try{
Statement stmt = new Conec().getADOconection();
ResultSet rs = stmt.executeQuery("select * from proprietario
where id = 1");
rs.next();
return new Proprietario(rs.getInt("id"), rs.getString("nome"));
}
catch (Exception e) {
return null;
}
}
public boolean operacaoInsert(Proprietario prop){
try{
Statement stmt = new ccc().getADOconection();
stmt.execute("insert into proprietario (id, nome) values("
+ prop.getId +", " + prop.getNome +");");
return true;
}
catch (Exception e) {
return false;
}
}
Código Fonte 5: Classe para persistência de dados via JDBC
As operações de CRUD podem ser divididas em dois tipos: as simplesmente executadas
“stmt.execute”, que não retornam informações do banco, e as querys “stmt.executeQuery”,
estas retornam uma lista de dados compatíveis com busca realizada no banco.
Neste código, também nota-se a necessidade de desmontar o objeto para deixá-lo
compatível com os dados manipuláveis pelo banco de dados e também nota-se os trabalhos
para remontá-lo para que possa ser utilizado pela aplicação.
5.1.2. Hibernate (framework)
Apesar de todas as facilidades propostas pelo uso do Hibernate, as configurações
básicas no banco devem ser executadas invariavelmente, ou seja, a criação das tabelas
propostas no item anterior devem ser implementadas no banco de dados diretamente.
34
Entretanto, a partir deste ponto iniciam-se diferenças, a começar pela conexão com o
banco de dados. Utilizando-se de um arquivo XML, com as informações de conexão e link
para os arquivos de mapeamento das tabelas, o Hibernate é capaz de se conectar com o
banco.
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="Hibernate.dialect">
org.hibernate.dialect.PostgreDialect
</property>
<property name="Hibernate.connection.driver_class">
org.postgresql.Driver
</property>
<property name="Hibernate.connection.url">
jdbc:postgresql://localhost/TCCpostgre:5432
</property>
<property name="Hibernate.connection.username">
postgre
</property>
<property name="Hibernate.connection.password">
shaman
</property>
<mapping resource="proprietario.hbm.xml"/>
<mapping resource="veiculo.hbm.xml"/>
</session-factory>
Código Fonte 6: Arquivo XML para configuração da conexão via Hibernate
No código fonte acima podemos verificar alguns itens importantes.
1. A tag “<session-factory>” é responsável por informar ao Hibernate os
parâmetros de configuração;
2. Nas tags “<property name>” são informados parâmetro individuais de conexão
e informação:
•
“Hibernate.dialect”: informa qual o padrão de linguagem SQL o banco de
dados utiliza;
•
“Hibernate.connection.driver_class”: Corresponde ao nome do driver
JDBC;
•
“Hibernate.connection.url”: Endereço de conexão do banco;
•
“Hibernate.connection.username”: Nome de usuário do banco ;
•
“Hibernate.connection.password”: Senha do usuário;
3. E por fim as tag <mapping resource> que indicam os arquivos XML onde estão
mapeados os objetos a serem persistidos.
35
Com o parâmetro de conexão mapeado faz-se necessária a criação de uma classe
que instancia conexão com o banco.
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtility {
private static SessionFactory factory;
static {
try {
factory = new
Configuration().configure().buildSessionFactory();
}
catch (Exception e) {
e.printStackTrace();
factory = null;
}
}
public static Session getSession() {
return factory.openSession();
}
}
Código Fonte 7: Classe que realiza a conexão com banco via Hibernate
O objeto “factory” lê o arquivo XML e através do método “openSession” retorna uma
sessão do Hibernate.
Entretanto, ao fazer uso do Hibernate, é preciso algumas configurações extras.
Inicialmente é preciso mapear a tabela do banco em relação ao objeto a ser persistido
através de um arquivo XML:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate Mapping DTD 3.0//EN"
"hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Proprietario" table="proprietario">
<id name="id" column="id" type="integer">
< generator class="assigned"/>
</id>
<property name="nome" column="nome" type="string"/>
</class>
</hibernate-mapping>
Código Fonte 8: Arquivo XML de mapeamento da classe proprietário
36
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate Mapping DTD 3.0//EN"
"hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Veiculo" table="veiculo">
<id name="placa" column="placa" type="string">
< generator class="assigned"/>
</id>
<property name="modelo" column="modelo" type="string"/>
<one-to-many name="proprietario"
column="id"
class="Proprietario"/>
</class>
</hibernate-mapping>
Código Fonte 9: Arquivo XML de mapeamento da classe veículo
Na tag <class> o parâmetro “name” recebe o nome da classe a ser mapeada e o
parâmetro “table” o nome da tabela correspondente no banco de dados.
Na tag <id> o parâmetro “name” indica o nome do atributo chave correspondente ao
objeto, o parâmetro “column” indica o nome da coluna na tabela e o parâmetro “type” o tipo
do dado.
O mesmo vale para a tag <property>.
Outra característica neste caso é o relacionamento que também deve estar
configurado no banco. Ele é informado ao Hibernate pela tag <one-to-many> que consiste
em:
•
“name”: nome da tabela;
•
“column” nome da coluna referência
•
“class” classe correspondente ao objeto com o qual o item vai se relacionar.
Outras variantes desta tag são <one-to-one> e <many to many>
Uma vez mapeado o objeto, as operações podem ser realizadas pelos comandos:
37
public class crud(){
private SessionFactory factory;
HibernateUtility p = new HibernateUtility();
public crud throws Exception{
factory = p.getSession();
}
public void UsInserir(Proprietario prop) throws Exception {
Session session = factory.openSession();
session.save(prop);
session.flush();
session.close();
}
public void UsAlterar(Proprietario prop) throws Exception {
Session session = factory.openSession();
session.update(prop);
session.flush();
session.close();
}
public void UsExcluir(Proprietario prop) throws Exception {
Session session = factory.openSession();
Session.delete(us);
session.flush();
session.close();
}
public Usuario UsRecuperar(Proprietario prop) throws Exception {
Session session = factory.openSession();
Usuario us = session.load(prop, prop.getId);
session.flush();
session.close();
return prop;
}
}
Código Fonte 10: Operações de CRUD via Hibernate
Apesar da complexidade em mapear os dados e a conexão em arquivos XML, a
classe final, responsável por manipular os dados no banco se torna muito simples e
compacta.
5.1.3. DB4o (orientado à objeto)
Assim como no modelo relacional, no modelo orientado à objeto é necessário haver
uma classe de conexão com o banco de dados, que se mostra muito similar.
38
import com.db4o.Db4o;
import com.db4o.ObjectContainer;
public class Main {
public static void main(String[] args) {
Integer porta = 8000;
String usuario= "user";
String senha = "123";
ObjectContainer db = Db4o.openServer("//localhost/banco.yap",
porta);
db.grantAccess(usuario,senha);
try {
// algum código db4o
} finally {
db.close();
}
}
Código Fonte 11: Classe de conexão com bando de dados OO
No comando “Db4o.openServer()” deve se informar o endereço do banco e a porta
onde o serviço está executado, enquanto no comando “db.grantAccess()” é informado o
usuário e a senha do banco.
Entretanto aqui é possível verificar a primeira diferença. É necessário alterar a classe
proprietário para definir o relacionamento, pois como não existem tabelas neste modelo de
banco de dados, os relacionamentos ocorrem diretamente nos objetos. Portanto é preciso
que a classe proprietário contenha um atributo chamado veículo, e como o relacionamento é
do tipo 1:N, o atributo veículo deve ser um array, logo nossa classe ficará assim:
39
public class Proprietario {
private int id = 0;
private String nome = null;
private ArrayList<Veiculo> veic = null;
public Proprietario(int id, String nome) {
this.id = id;
this.nome = nome;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public Veiculo getVeic(int index) {
return veic.get(index);
}
public void setVeic(Veiculo vei) {
veic.add(vei);
}
}
Código Fonte 12: Classe cliente relacionada coma classe veiculo
No DB4o, as operações de CRUD tornam-se ainda mais simples, bastando apenas
informar o objeto a sofrer a operação. Como este banco de dados possui um mecanismo de
serialização de objetos, ele garante a unicidade dos objetos, para no caso de uma exclusão
ou alteração ser executada no objeto correto, mesmo que em termos de conteúdo existam
objetos similares.
40
public class Perssist {
private ObjectContainer db = Db4o.openFile("c:/guerra.yap");
public salvar(Cliente cli) {
db.set(cli);
}
public update(Cliente cli) {
ObjectSet<Cliente> lista = db.get(obter(
new Cliente (777,"Maria")));
Cliente cliente = lista.next();
cliente.setNome("Maria José");
db.set(cliente);
}
public delete(Cliente cli) {
ObjectSet<Cliente> lista = db.get(obter
(new Cliente (777,"Maria")));
Cliente cliente = lista.next();
cliente.setNome("Maria José");
db.delete(cliente);
}
public Cliente obter(Cliente cli) {
Query query = db.query();
query.constrain(Cliente.class);
query.descend("codigo").constrain(
cli.getId_cliente()).smaller();
ObjectSet<Cliente> lista = query.execute();
while (lista.hasNext()){
return lista.next();
}
}
}
Código Fonte 13: Operações de CRUD via DB4o.
5.2. Índices e chaves
Índice é um roteiro ordenado, alfabético ou sistemático, dos itens de uma coleção.
Pode ser também o conteúdo de um documento, acompanhado de referenciais que
permitem a identificação e localização do próprio conteúdo. O índice é um mecanismo
auxiliar, usado no armazenamento, busca e recuperação da informação.
Pense assim: quando você quer achar um tópico de um livro, você o folheia todo até
achar ou procura no índice? (se ficou com a primeira opção é porque o livro é pequeno e
bem conhecido - isso nem sempre acontece com seu banco de dados). Logo, em um banco
de dados o índice é igual qualquer outro índice, o banco "organiza" o conteúdo de
determinadas colunas (ou todas) para facilitar a busca.
Resumindo, o Índice é um arquivo auxiliar associado a uma Tabela. Sua função é
acelerar o tempo de acesso às linhas de uma Tabela, cria ponteiros para os dados
armazenados em colunas especificas. O Banco de dados usa o índice de maneira
semelhante ao índice remissivo de um livro, verifica um determinado assunto no Índice e
depois localiza a sua posição em uma determinada página.
41
Nesse contexto, quando se fala em chaves (primaria ou estrangeira), nada mais é que
um índice único, não nulo (no caso de chave primaria) ou um índice de outra tabela (chave
estrangeira)
5.2.1. PostgreSQL
Como mencionado acima, num banco de dados relacional o índice auxilia na
recuperação de dados, melhorando significativamente no desempenho do banco. Ou seja, é
implementado tal como sua definição, aplicando-se também para chaves primarias e
estrangeiras.
CREATE TABLE nome_tabela (
campo1 <tipo> NOT NULL,
campo2 <tipo> NOT NULL,
campoX <tipo>,
PRIMARY KEY (campo1, campo2)
);
Código Fonte 14: exemplo de declaração de chave primaria
5.2.2. Hibernate
No hibernate, o conceito de índice e chaves deve ser implementado diretamente no
banco de dados, uma vez que o hibernate apenas faz o mapeamento objeto relacional.
5.2.3. BD4o
Segundo Rogério Weinert (2008)
Antes de mais nada, a visão relacional em um ambiente orientado a objetos
não é aplicável, pois no caso de um SGBDOO cada objeto é único.
Num SGDBOO é implementado do conceito de UUID´s (Universal Unique ID) que são
na realidade um objeto associado a cada objeto que existe no banco e sendo muito mais
"fortes" que as ID´s, pois indicam ao SGDOO a real unicidade de um objeto.
Como dito anteriormente uma chave primaria é um índice único e não nulo, e não
deve ser confundido com uma “sequence” implantada junto a essa chave. Por exemplo, no
DB4o esta “sequence” deve ser implantada no código fonte da aplicação, mas deve-se ter
em mente que o DB4O "conhece" cada objeto dentro do banco, independente da chave
customizada que eles contenham. Podem até existir dois objetos com a mesma chave, o
DB4O consegue diferenciar os dois.
Para se criar um índice no DB40, tendo por base o código fonte 2 desta apresentação
teremos:
42
Db4o.Configure().ObjectClass(typeof(Proprietario)).ObjectField("Nome").Indexed(true);
O inconveniente fica pelo fato da aplicação também ter que garantir a unicidade do
objeto sempre que preciso.
5.3. Procedures e Triggers
Procedure é uma coleção de comandos em SQL para gerenciamento de Banco de
dados. Encapsula tarefas repetitivas, aceita parâmetros de entrada e retorna um valor de
status (para indicar aceitação ou falha na execução). O procedimento armazenado pode
reduzir o tráfego na rede, melhorar a desempenho, criar mecanismos de segurança, etc.
Já uma trigger é um recurso de programação que sempre é acionado a ocorrência de
um evento, é muito utilizada para ajudar a manter a consistência dos dados ou para
propagar alterações em um determinado dado de uma tabela para outras. Um bom exemplo
é uma trigger criada para controle de quem alterou a tabela. Nesse caso, quando a
alteração for efetuada, a trigger é disparada e grava em uma tabela de histórico de
alteração, o usuário e data/hora da alteração.
Atualmente os SGDBOO não têm implantada essa característica, ficando por conta do
programador integrar as funções necessárias ao seu projeto.
5.4. Desempenho
O teste abaixo visa de forma simples demonstrar os resultados de desempenho dos
modelos de persistência de dados.
5.4.1. Ambiente
Para o teste de desempenho foi utilizado o seguinte ambiente:
•
Notebook Itautec®;
•
Processador Intel® Celeron M 1,6Ghz;
•
1,43GB memória RAM;
•
Windows XP® Home SP3;
•
SGDB’s conforme proposto no capitulo 1 subseção 2;
5.4.2. Metodologia
Passo 1: - Foram implementados os objetos conforme descritos nos códigos fontes ao
longo desta monografia;
Passo 2: - Elaborada função que realizava automaticamente operações de inserção,
deleção, update e consulta repetidamente por 1000 vezes cada uma, tendo seus tempos
totalizados em seguida;
43
Passo 3: - Repetição da operação por 3 vezes, e obtenção do tempo médio de cada
uma das três metodologias de implementação;
5.4.3. Resultados
Tempo médio
Metodologia
SGBD / Framework
Relacional
PostgreSQL
0,38
Framework
Hibernate
0,59
Orientado à objeto
DB4o
0,34
(s)
Tabela 2: Comparativo entre implementações
Inicialmente deve-se observar que os métodos foram desenvolvidos pelo autor desta
apresentação com base em analise estatísticas, entretanto deve-se levar em conta o fato de
que em ambientes diferentes os resultados podem e devem variar.
Analisando a tabela 2 pode-se constatar certo equilíbrio entre o SGBDR e o SGBDOO,
entretanto o uso do framework demonstrou uma queda no desempenho, uma vez que se
trata da implementação de uma camada extra, o que resulta em varias conversões,
mapeamentos e consultas realizados antes da operação propriamente dita.
44
6. RESULTADOS OBTIDOS
O framework se mostra útil para aproximar o modelo relacional do modelo orientado a
objeto, sem muitos ganhos no quesito desenvolvimento, mas mostrando força imensa
quando de migra de um serviço de banco de dados relacional para outro. Neste caso, basta
uma pequena configuração no arquivo descrito no código fonte 6 e nada mais, uma vez que
o framework é o responsável por gerenciar a persistência, sua aplicação não apresenta
necessidade de manutenções no caso de uma migração na base de dados.
Outro ponto é a simplicidade com que o modelo orientado à objeto trabalha com os
objetos, sem a necessidade de configurar um banco de dados ou mesmo os vários arquivos
de mapeamento do framework. Tratando os objetos de uma maneira transparente ao
programador, respeitando todas as características do objeto, reduzindo assim muito o tempo
de desenvolvimento.
Logo as tecnologias estudadas, com base na metodologia usada, não presentearam
nenhuma característica que a tornasse uma melhor escolha em detrimento à outra, mas
sempre é recomendada uma análise profunda do projeto. Num exemplo mais simples um
controle de clientes pode ser feito tanto no modelo relacional quanto no modelo orientado a
objeto, mas:
•
Quando se busca facilidade em controlar integridade é preferível o modelo
relacional;
•
Quando a preocupação for posteriores migrações na base de dados, o
framework é uma ótima alternativa;
•
Caso o desejo seja simplicidade de desenvolvimento é melhor o modelo
orientado a objeto.
Para finalizar, pode-se observar que todas as metodologias de implementação são
muito boas. Além disso, possuem recursos e vantagens que se complementam, o que
significa que, para a maioria das aplicações, todas podem ser usadas. Na verdade, o correto
não é tentar descobrir qual é a melhor, mas em que situação uma ou outra deve ser
utilizada. Portanto deve-se entender bem quais recursos sua aplicação precisa, tentado
estimar o volume de dados, o hardware disponível, e as funcionalidades necessárias.
Todavia, há situações em que todas as metodologias serão boas escolhas. Nesses
casos, é recomendável fazer testes e avaliar qual oferece mais vantagens à aplicação.
Um banco de dados pode ser a diferença entre ter e não ter um negócio seja ele de
qualquer porte. Por isso, a escolha deve ser bem feita e aspectos como desempenho,
recursos, documentação e suporte devem ser considerados.
A seguir temos uma tabela comparativa com as principais características
apresentadas por cada modelo de implementação.
45
6.1. Comparativo de características
Modelo de Implementação
Característica
Relacional
Framework
Orientado a Objeto
CRUD
9
SQL;
9
Mapeamento;
9
Comandos próprios;
Relacionamentos
9
Conceito de chaves estrangeiras;
9
Chaves mapeadas;
9
Mesmo das linguagens OO;
9
As
9
Maior integração com a linguagem
9
Não elimina o uso de SQL;
iniciais
dependem de mapeamento de
Simplicidade de
Implementação
configurações
objetos;
9
Depende do driver de conexão
utilizada;
9
utilizado;
Não elimina a programação direta
no banco de dados;
9
no banco;
9
Triggers
9
9
São implementadas diretamente
Utiliza
a
capacidade
Não
há
trigger,
estas
9
desempenho do servidor de DB
Índices
Material de
Consulta
9
Possui
índices,
com
Facilmente encontrado;
na
própria
Seu
desempenho
depende
da
estrutura utilizada pela aplicação
a 9
possibilidade do índice único
9
implementada
aplicação;
são
implementadas do SGBD;
e
É
Não
há
índices,
estes
são 9
implementadas do SGBD;
9
Tão
disponível
quanto
Há
índices,
mas
índices únicos;
sua
aceitação de mercado;
Tabela 3: Comparativo entre modelos de implementação
9
Material escasso
não
existes
46
7. BIBLIOGRAFIA
NASSU, Eugenio A.; SETZER, Valdemar W. Banco de dados Orientados a
Objetos. São Paulo: Edgard Blucher, 1999. 136p
DATE, C. J. Uma Introdução a Sistemas de Banco de Dados. São Paulo: Edgard
Blucher, 1999. 896p.
BAUER, Christian; KING, Gavin. Hibernate em Ação. São Paulo: Ciência Moderna,
2005. 560p
FAYAD, Mohamed; SCHIMIDT, Douglas C. Object-oriented application frameworks ,
New York, ACM, 1997 38p.
MONTEIRO,
Eduarod.
Db4o:
Banco
OO.
Disponível
via
URL
em:
http://imasters.uol.com.br/artigo/5056/bancodedados/db4o_banco_oo. Acesso em:
13 de abr. de 2008.
GUERRA, Gláucio. DB4Objects na terra de gigantes do BD relacional com Java.
Disponível via URL em: http://www.devmedia.com.br/articles/viewcomp.asp?comp=4121.
Acesso em: 27 de abr. de 2008.
_____.
DB4Objects
–
parte
II
–
mãos
a
obra.
Disponível
via
URL
em:
http://www.devmedia.com.br/articles/viewcomp.asp?comp=4137&hl=*db4o*. Acesso em: 27
de abr. de 2008.
_____. DB4Objects – parte III: Armazenando objetos relacionados. Disponível via URL
em:
http://www.devmedia.com.br/articles/viewcomp.asp?comp=4323&hl=*db4o*.
Acesso
em: 27 de abr. de 2008.
_____. DB4Objects na prática – parte IV: Aplicação embedded server. Disponível via
URL
em:
http://www.devmedia.com.br/articles/viewcomp.asp?comp=4495&hl=*db4o*.
Acesso em: 27 de abr. de 2008.
MAIA, Italo M. C. DB4Objects na DB4O – Um BD com estilo!. Disponível via URL em:
http://www.db4o.com/portugues/guj-db4o.pdf. Acesso em: 27 de abr. de 2008.
47
LINHARES, Mauricio. Introdução ao Hibernate 3. Disponível via URL em:
www.guj.com.br/content/articles/hibernate/intruducao_hibernate3_guj.pdf. Acesso em 27
abr. de 2008.
MARINHEIRO,
Wellington.
Tutorial
Hibenate.
Disponível
via
URL
em:
http://www.livramento.yu.com.br/Hibernate.html. Acesso em: 01 de mai. de 2008.
CARVALHO, Marcio Santos. Persistindo Objetos com Java, Hibernate e PostgreSQL.
Disponível via URL em: http://www.devmedia.com.br/articles/viewcomp.asp?comp=4149.
Acesso em: 01 de mai. de 2008.
ROQUE,
Bruno.
UML
-
Que
raios
é
isso?.
Disponível
via
URL
em:
http://www.plugmasters.com.br/sys/materias/476/1/UML---Que-raios-%E9-isso%3F. Acesso
em: 03 de mai. de 2008.
SUN
MICROSYSTENS.
JDBC
Introduction.
Disponível
via
URL
em:
http://java.sun.com/docs/books/tutorial/jdbc/overview/index.html. Acesso em: 03 de mai. de
2008.
BORBA,
Sueli
de
Fátima
Poppi.
Metodologia
Para
Implantação
De
Modelos
Multidimensionais Em Banco De Dados Orientado A Objetos. 2006. 228f. Tese
(Doutorado em Engenharia de Produção) - Universidade Federal de Santa Catarina,
Florianópolis.
OLIVEIRA, Lucas Gonçalves. Construção de um sistema de Blackboard para gestão de
documentos usando XML. 2004. 81f. Tese (Conclusão de Curso em Sistemas de
informação) – Pontifícia Universidade Católica de Minas Gerais, Arcos.
The PostgreSQL Global Development Group. Manual de Referência do PostgreSQL 7.3.2.
Tradução. Traduzido por Halley Pacheco de Oliveira. 1996. 334p
DEITEL, H.M; DEITEL P.J. Java: Como programar. 4ª Ed. Porto Alegre: Bookman, 2003.
893p.
JANDL, Peter J. Introdução ao Java. São Paulo: Berkeley, 2002. 492p.
SUN Microsystems. Java API Documentation. Disponível
http://java.sun.com/javase/6/docs/. Acesso em: 01 de mai. De 2008.
via
URL
em:

Documentos relacionados