Banco de Dados - Caché

Uma Nova Era na Tecnologia dos Bancos de Dados

Os bancos de dados OO evoluiram muito nos últimos cinco anos, e atingiram maturidade e performance surpreendentes. As novas estratégias de armazenamento e recuperação permitem que esses bancos consigam um tempo de resposta geralmente melhor do que as subseqüentes chamadas a um banco relacional, necessárias para desmontar e remontar objetos. Vários fabricantes oferecem produtos que suportam diretamente encapsulamento, herança e polimorfismo – características fundamentais dos objetos. Caché, da InterSystems, é um representante dessa categoria.

por Equipe Linha de Código



O modelo orientado a objeto (OO) tem sido fortemente divulgado pelos desenvolvedores de software e muito bem aceito pelas principais empresas e organizações. O mercado que demanda essa tecnologia deve alcançar a cifra de US$10.5 bilhões em 2002, apenas nos EUA.

No Brasil, vários órgãos do governo e grandes empresas dos setores financeiro, elétrico, de telecomunicações e de saúde definiram que vão empregar orientação a objeto, principalmente Java, em todos os novos projetos. Isso porque essa tecnologia oferece aumento de produtividade, segurança e facilidade de manutenção. Como objetos são modulares, mudanças podem ser feitas internamente, sem afetar inadvertidamente outras partes do programa. A capacidade de utilizar componentes (verdadeiros blocos de construção de software, já testados e validados) representa uma revolução na engenharia de software.

Qualquer aplicação corporativa precisa utilizar dados, um grande volume de dados. Os dados são armazenados em servidores por softwares especializados: os Servidores de Gerenciamento de Banco de Dados (SGBD), ou, simplesmente, banco de dados. Atualmente, os bancos de dados são predominantemente relacionais, mas uma aplicação orientada a objeto precisa armazenar objetos. Como armazenar objetos em um banco de dados relacional? Os bancos de dados orientados a objeto são viáveis? Vamos entender melhor cada um dos modelos.

O Modelo Orientado a Objeto

O modelo orientado a objeto é baseado no conceito de classes, que possuem atributos e métodos fortemente acoplados. Os objetos são as ocorrências de uma classe. Cada objeto possui um estado, definido pelo valor de seus atributos, e um comportamento, definido por seus métodos.

Enquanto em um programa estruturado os atributos (ou variáveis) ficam espalhados pelo código, em um programa OO os atributos são armazenados dentro dos objetos. Podemos definir a visibilidade de um atributo, dizendo se ele é público, protegido ou privado. Uma boa técnica é definir todos os atributos como privados e fornecer métodos (ou funções) para que outros objetos tenham acesso controlado a seu valor. Isto é chamado encapsulamento.

Uma classe pode estender outra para adicionar ou modificar funcionalidades. A nova classe herda todos os métodos e atributos da classe original, também chamada superclasse. Esse recurso, que permite uma grande reutilização de código, é chamado herança.

Se a assinatura de um método espera receber como parâmetro uma determinada classe, podemos passar uma classe filha, pois sabemos que a classe filha possui todos os atributos e métodos da classe original. Isto é chamado polimorfismo.

Encapsulamento, herança e polimorfismo são as três principais características do modelo orientado a objeto.

O Modelo Relacional

O modelo relacional é baseado no conceito matemático de relação. Os matemáticos definem como relação um subconjunto de um produto cartesiano de uma lista de domínios. Uma tabela é uma relação, e suas linhas representam relacionamentos entre um conjunto de valores.

Em uma tabela, identificamos cada uma de suas linhas a partir de uma chave única, ou chave primária. Essa chave pode ser simples, formada por apenas uma coluna, ou composta, formada por duas ou mais colunas. Os bancos de dados possuem mecanismos para garantir que a unicidade da chave primária seja preservada.

As chaves únicas também são utilizadas para criar relacionamentos de uma linha com linhas armazenadas em outras tabelas. Ao replicarmos o valor de uma chave em outra tabela, podemos identificar quais linhas se relacionam. Nessas outras tabelas, as chaves são conhecidas como chaves estrangeiras. Esse artifício nos permite criar ligações entre tabelas, e representar relacionamentos com cardinalidade um-para-muitos e muitos-para-um.

A álgebra relacional é uma linguagem procedural, e suas operações básicas são: seleção, projeção, produto cartesiano, união e diferença entre conjuntos. Todas essas operações produzem uma nova relação como resultado. As operações de consulta de um banco de dados relacional são construídas sobre essas operações básicas. É claro que os bancos de dados comerciais oferecem linguagens mais amigáveis do que expressões matemáticas, sendo o SQL a mais utilizada.

O SQL é um acrônimo para Structured Query Language. A estrutura básica de uma expressão SQL consiste em três cláusulas: select, from e where. O SQL forma o produto cartesiano das relações especificadas na cláusula from, faz uma seleção em álgebra relacional usando o predicado da cláusula where e projeta o resultado nos atributos da cláusula select. O resultado de uma consulta SQL é, naturalmente, uma relação.

A linguagem SQL é mais do que uma linguagem de consulta. Ela possui também recursos para a criação de tabelas, definição de regras de integridade, inclusão e remoção de registros, e funções de controle necessárias para o gerenciamento de dados. A linguagem SQL possui um pequeno número de tipos de dados, e o desenvolvedor precisa construir todo o seu modelo de dados usando apenas esses tipos oferecidos.

São características dos bancos de dados relacionais: capacidade de armazenar grande volume de dados, executar pesquisas rápidas, identificar e tratar erros para garantir a integridade dos dados.

O maior ganho da utilização do modelo relacional é a separação entre os dados e a lógica de negócios, reduzindo a complexidade das aplicações e utilizando os recursos oferecidos pelos bancos de dados para garantir a integridade das informações.

A Impedância Entre os Modelos OO e Relacional

O modelo relacional é simples, mas fundamentalmente diferente do modelo OO. Bancos de dados relacionais não foram concebidos para armazenar objetos, e programar uma interface para armazenar objetos em tabelas não é uma tarefa trivial.

Bancos de dados relacionais não possuem mecanismos para representar características básicas de objetos, como encapsulamento, herança e polimorfismo. Enquanto objetos possuem identidade, estado e comportamento, o modelo relacional pode apenas armazenar dados em tabelas. Só o armazenamento dos dados já é um grande problema. Os limitados tipos disponíveis no SQL não são suficientes para representar as informações de um objeto. Além disso, objetos complexos e agregações precisam de várias tabelas para serem “normalizados”.

Objetos são interligados por referências, tabelas são relacionadas através de chaves primárias e chaves estrangeiras. Um modelo relacional busca normalizar as informações, ou seja, eliminar ao máximo a redundância dos dados armazenados nas tabelas, enquanto um modelo OO busca criar objetos que representem o mundo real.

Em geral, duas abordagens são empregadas para armazenar objetos em bancos relacionais: partir da modelagem OO e criar as tabelas para representar os objetos, ou partir de um modelo relacional e criar objetos para representar os processos. A primeira exige programação adicional para refletir as estruturas dos objetos em tabelas, uma situação em que a manutenção do código é complexa e cara. A segunda abordagem pode comprometer totalmente a modelagem da aplicação. Mesmo utilizando uma linguagem orientada a objeto, sua estrutura pode vir a ser muito próxima às antiquadas soluções cliente/servidor.

Uma estratégia para mapeamento objeto-relacional requer um sólido conhecimento das similaridades e diferenças dos dois modelos. É necessário garantir a performance e a robustez nessa solução.

Existem várias ferramentas no mercado que facilitam esse trabalho, como o TopLink e o Persistence.

O Estado da Arte

Os bancos de dados OO evoluiram muito nos últimos cinco anos, e atingiram maturidade e performance surpreendentes. As novas estratégias de armazenamento e recuperação permitem que esses bancos consigam um tempo de resposta geralmente melhor do que as subseqüentes chamadas a um banco relacional, necessárias para desmontar e remontar objetos. Vários fabricantes oferecem produtos que suportam diretamente encapsulamento, herança e polimorfismo – características fundamentais dos objetos. Caché, da InterSystems, é um representante dessa categoria.

Embora seja mais fácil desenvolver suas aplicações orientadas a objeto utilizando os recursos de um banco de dados OO, muitas vezes temos que fazer integração com uma base relacional que não pode ser modificada. O modelo relacional foi amplamente empregado nos últimos quinze anos, e não podemos simplesmente “descartar” todas as aplicações já construídas. Esses sistemas devem coexistir pacificamente com as novas aplicações OO. Nesse ponto destacam-se os bancos de dados pós-relacionais. Oferecendo um suporte aos dois modelos, objeto e relacional, esses produtos permitem que todo o investimento nas antigas aplicações seja preservado, enquanto as novas aplicações são construídas utilizando a tecnologia de objetos. A idéia é evolução, e não revolução.

O Caché é um banco de dados pós-relacional que possui uma arquitetura unificada de dados. Objetos e tabelas são descritos por um meta-modelo, e o próprio banco de dados se encarrega de fazer o mapeamento em ambas as direções. Ao criarmos uma classe, o banco cria as tabelas correspondentes; quando alteramos uma tabela, a definição da classe é automaticamente atualizada. O acesso aos objetos e tabelas é independente, diferentemente do que ocorre quando um banco relacional oferece uma “visão” de objetos, empilhando camadas de mapeamento. Além disso, sua estrutura de armazenamento multidimensional permite a manipulação de coleções e objetos através de um único acesso.

Quando uma query SQL é executada pela primeira vez, ela é analisada e otimizada (como em outros bancos de dados). Entretanto, o Caché gera uma stored procedure que é mantida em cache, e reutilizada para todas as chamadas subseqüentes.

O Caché suporta desenvolvimento em Java, Enterprise JavaBeans, C++, Caché ObjectScript, Corba e ActiveX. Possui mecanismos para geração e armazenamento de documentos XML. Suporta conexões JDBC e ODBC.

Conclusão

As aplicações cliente/servidor, desenvolvidas em bancos de dados relacionais, não se adaptam à nova realidade imposta pela Internet, naturalmente heterogênea e distribuída. Novas aplicações são construídas com arquitetura de três camadas, utilizando as vantagens tecnológicas da orientação a objeto.

Armazenar objetos em um banco de dados relacional é uma tarefa difícil. O modelo relacional não possui os mecanismos necessários para representar características básicas do modelo OO. Nesse cenário, um banco de dados relacional não traz nenhuma vantagem. A escolha de um banco de dados OO é a evolução natural.

Hoje, bancos de dados OO são produtos estáveis, oferecem segurança, performance e escalabilidade. Armazenar e recuperar objetos de um banco de dados OO é efetivamente mais rápido do que pulverizar seus atributos em tabelas de duas dimensões. Mas a performance do seu banco de dados OO é apenas uma parte. Definir corretamente a arquitetura de sua aplicação é fundamental e requer experiência.

Equipe Linha de Código

Equipe Linha de Código