U NIVERSIDADE F EDERAL DE G OIÁS
I NSTITUTO DE I NFORMÁTICA
F LÁVIO DE A SSIS V ILELA
Um método de integração de dados
armazenados em bancos de dados
relacionais e NOSQL
Goiânia
2015
F LÁVIO DE A SSIS V ILELA
Um método de integração de dados
armazenados em bancos de dados
relacionais e NOSQL
Dissertação apresentada ao Programa de Pós–Graduação do
Instituto de Informática da Universidade Federal de Goiás,
como requisito parcial para obtenção do título de Mestre em
Computação.
Área de concentração: Ciência da Computação.
Orientador: Prof. Dr. João Carlos da Silva
Co-Orientador: Prof. Dr. Fábio Nogueira de Lucena
Goiânia
2015
F LÁVIO DE A SSIS V ILELA
Um método de integração de dados
armazenados em bancos de dados
relacionais e NOSQL
Dissertação defendida no Programa de Pós–Graduação do Instituto de
Informática da Universidade Federal de Goiás como requisito parcial
para obtenção do título de Mestre em Computação, aprovada em
07 de Setembro de 2015, pela Banca Examinadora constituída pelos
professores:
Prof. Dr. João Carlos da Silva
Instituto de Informática – UFG
Presidente da Banca
Prof. Dr. Fábio Nogueira de Lucena
Instituto de Informática – UFG
Prof. Dr. Leonardo Andrade Ribeiro
Universidade Federal de Goiás – UFG
Todos os direitos reservados. É proibida a reprodução total ou parcial do
trabalho sem autorização da universidade, do autor e do orientador(a).
Flávio de Assis Vilela
Graduado em Sistemas de Informação pelo Instituto Federal de Goiás - Campus Jataí. Possui o título de Especialista em Desenvolvimento de Software
pela instituição Senac. Atualmente é professor no Instituto Federal de Goiás Campus Jataí e analista de sistemas na empresa FAV Sistemas, em Jataí - GO.
À minha irmã Larissa.
Agradecimentos
Primeiramente, agradeço aos meus pais por sempre acreditarem em mim, que,
apesar de todas as nossas dificuldades (psicológicas, familiares e financeiras), me apoiaram em todas as decisões e sempre me incentivaram a buscar novos conhecimentos,
motivo pelo qual me fez ingressar no mestrado.
Agradeço imensamente ao professor Dr. João Carlos que, primeiramente, me
aceitou como seu orientando, e, desde então, foi a pessoa que mais contribuiu na minha
formação acadêmica, intelectual e pessoal. Agradeço pelos conhecimentos em Banco de
Dados com ele adquiridos, pela disponibilidade, pela paciência e pela confiança em mim
depositado.
Agradeço ao professor Dr. Fábio Nogueira de Lucena que desempenhou um
papel importante para a conclusão deste trabalho. Em todo o momento, não mediu
esforços para me atender, sempre com novas idéias para melhorar o trabalho e me
ajudando imensamente em dúvidas referentes à implementação. Agradeço ainda pela
paciência na correção dos trabalhos escritos e pelas sugestões propostas.
Aos colegas de mestrado que muitas vezes dedicaram seu tempo para me ajudar,
em especial à Mariana, que nunca se absteve em me ajudar, principalmente na etapa da
escrita do texto. Aos colegas de disciplinas que fiz durante o mestrado, especialmente a
Walquiria e ao Cleon, pessoas que estiveram ao meu lado durante todo este longo percurso
e, com nossas afinidades, nos fizemos amigos.
Não há lugar para expressar o sentimento que sinto (ódio, raiva, impunidade),
mas acredito que aqui seja um local oportuno e que ficará registrado para todos que fizer
a leitura deste trabalho. Agradeço a você, minha irmã Larissa, por sempre ter sido uma
pessoa dedicada nos estudos e melhor a cada dia, motivo que me faz espelhar em você.
Uma pena que Deus não deixou você defender seu mestrado, e, dias antes, te chamou pra
morar com Ele. Ah, quanto ao sentimento que sinto, sim, é saudade, imensa saudade.
Resumo
de Assis Vilela, Flávio. Um método de integração de dados armazenados em
bancos de dados relacionais e NOSQL. Goiânia, 2015. 98p. Dissertação de
Mestrado. Instituto de Informática, Universidade Federal de Goiás.
O aumento da quantidade e variedade de dados disponíveis na Web contribuiu com o surgimento da abordagem NOSQL, visando atender novas demandas, como disponibilidade,
flexibilidade de esquema e escalabilidade. Paralelamente, bancos de dados relacionais são
largamente utilizados para armazenamento e manipulação de dados estruturados, oferecendo estabilidade e integridade de dados, que são acessados através de uma linguagem
padrão, como SQL. Este trabalho apresenta um método de integração de dados armazenados em fontes heterogêneas, no qual uma consulta de entrada em SQL produz uma resposta unificada, baseada nas respostas parciais de bancos de dados relacionais e NOSQL.
Palavras–chave
Integração de dados, Banco de dados relacional, Banco de dados NOSQL.
Abstract
de Assis Vilela, Flávio. . Goiânia, 2015. 98p. MSc. Dissertation. Instituto de
Informática, Universidade Federal de Goiás.
The increase in quantity and variety of data available on the Web contributed to the
emergence of NOSQL approach, aiming at new demands, such as availability, schema
flexibility and scalability. At the same time, relational databases are widely used for
storing and manipulating structured data, providing stability and integrity of data, which
is accessed through a standard language such as SQL. This work presents a method for
integrating data stored in heterogeneous sources, in which an input query in standard
SQL produces a unified answer, based in the partial answers of relational and NOSQL
databases.
Keywords
Data integration, relational database, NoSQL Database.
Sumário
Lista de Figuras
10
Lista de Tabelas
12
1
Introdução
1.1
1.2
1.3
1.4
1.5
1.6
2
Trabalhos Relacionados
2.1
2.2
3
Integração de dados entre bancos de dados relacionais e NOSQL
Integração de dados entre bancos de dados relacionais e outras fontes de dados
Fundamentação teórica
3.1
3.2
3.3
3.4
3.5
4
Contextualização
Objetivos
Principais necessidades
Desafios encontrados
Restrições do método proposto
Organização do texto
Modelo relacional
Abordagem NOSQL
3.2.1
Modelo de dados
3.2.2
Categorias de bancos de dados NOSQL
3.2.3
Outras características da abordagem NOSQL
Dados estruturados e não estruturados
Metadados
Arquitetura JDBC
3.5.1
Driver JDBC para Cassandra
3.5.2
Driver JDBC para MongoDB
Um método para integração de dados armazenados em bancos de dados
relacionais e NOSQL
4.1
4.2
Modelo da solução proposta
Estrutura do método
4.2.1
Consulta SQL Inicial
4.2.2
Depósitos de dados
Elementos SQL
Metadados
Fontes de Dados
Resultados
4.2.3
Analisar Consulta SQL
1
1
3
4
4
5
6
7
7
9
18
18
20
21
21
28
30
32
33
35
36
37
37
38
38
39
40
41
44
44
44
5
4.2.4
Construir Comandos SQL
4.2.5
Controlar Execução de Consultas SQL
4.2.6
Gerenciar Resultados
4.2.7
Exemplo passo a passo
Um protótipo para avaliar o método de integração de dados
5.1
5.2
5.3
5.4
Desafios encontrados durante o desenvolvimento
Requisitos do protótipo
Descrição do protótipo
5.3.1
Tecnologias utilizadas
5.3.2
Funcionalidades do protótipo
Resultados obtidos
5.4.1
Ambiente dos experimentos
5.4.2
Exemplos de consultas
Consultas envolvendo apenas bancos de dados relacionais
Consultas envolvendo apenas bancos de dados NOSQL
Consultas envolvendo bancos de dados relacionais e bancos de dados NOSQL
5.5
6
Conclusão
6.1
6.2
A
Considerações Finais
Contribuições
Trabalhos Futuros
Dados para executar os experimentos
Referências Bibliográficas
46
48
49
50
53
53
54
55
55
55
58
59
66
67
68
74
78
80
81
81
83
94
Lista de Figuras
2.1
2.2
2.3
Middleware de integração de dados criado em [45]
Estrutura do método criado em [4].
Estrutura do método desenvolvido em [10].
8
12
13
3.1
3.2
3.3
3.4
3.5
Tipos de dados gerados nos últimos anos [39].
Estrutura do banco de dados chave-valor
Estrutura do banco de dados MongoDB [43]
Exemplo da estrutura de armazenamento do MongoDB
Comparação da sintaxe de criação de uma relação em banco de dados
relacional e MongoDB [22]
Comparação da sintaxe de inserção de dados em banco de dados relacional e MongoDB [22]
Comparação da sintaxe de consulta em banco de dados relacional e
MongoDB [22]
Estrutura de armazenamento do banco de dados Cassandra
Exemplo da sintaxe de criação de relações CQL [7]
Teorema CAP [42]
Exemplo de dados não estruturados
Tipos de drivers JDBC [46]
Exemplo da arquitetura JDBC [44]
19
22
22
23
Fluxo de dados do método proposto
Exemplo de consulta
Relações do depósito Elementos SQL
Outras relações do depósito Elementos SQL
Representação das relações que compõe os metadados
Estrutura de um banco de dados orientado a colunas mapeada para o
modelo relacional
4.7 Estrutura de um banco de dados orientado a documentos mapeada para
o modelo relacional
4.8 Exemplo de consulta SQL de entrada redefinida
4.9 Elementos SQL após a análise da consulta SQL
4.10 Consultas construídas pelo método.
4.11 Consulta inicial executada no depósito Resultados
39
39
40
41
42
5.1
5.2
5.3
5.4
55
56
57
57
3.6
3.7
3.8
3.9
3.10
3.11
3.12
3.13
4.1
4.2
4.3
4.4
4.5
4.6
Tela inicial do protótipo
Tela de cadastro metadados de conexão
Tela de cadastro de relações
Tela de cadastro de atributos
24
24
25
26
27
28
31
33
35
43
44
45
46
48
50
5.5
5.6
5.7
5.8
5.9
5.10
5.11
5.12
5.13
5.14
5.15
5.16
5.17
5.18
5.19
5.20
5.21
5.22
5.23
5.24
5.25
5.26
5.27
5.28
5.29
5.30
5.31
5.32
5.33
5.34
5.35
Tela de cadastro de domínios
Famílias de colunas criadas no banco de dados Cassandra.
Coleção de documentos Clientes criada no banco de dados MongoDB.
Coleção de documentos Fornecedor criada no banco de dados MongoDB.
Coleção de documentos CondPag criada no banco de dados MongoDB.
Relações criadas no banco de dados MSSQL Server.
Relação Funcionarios criada no banco de dados Postgresql.
Relações utilizadas no experimento
Ambiente dos experimentos
Exemplo - Consulta 1
Resultado da Consulta 1
Exemplo - Consulta 2
Resultado da Consulta 2
Exemplo - Consulta 3
Resultado da Consulta 3
Exemplo - Consulta 4
Resultado da Consulta 4
Exemplo - Consulta 5
Resultado da Consulta 5
Exemplo - Consulta 6
Resultado da Consulta 6
Exemplo - Consulta 7
Resultado da Consulta 7
Exemplo - Consulta 8
Resultado da Consulta 8
Exemplo - Consulta 9
Resultado da Consulta 9
Exemplo - Consulta 10
Resultado da Consulta 10
Exemplo - Consulta 11
Resultado da Consulta 11
58
60
61
61
62
63
64
64
66
67
67
68
68
69
69
70
70
71
71
72
72
73
73
74
74
75
75
76
76
77
77
Lista de Tabelas
2.1
2.2
3.1
Mapeamento da estrutura de um banco de dados relacional para o banco
de dados SimpleDB [4].
Características dos trabalhos relacionados
11
16
3.4
3.5
Comparação dos termos utilizados em bancos de dados relacionais e
MongoDB [22]
Exemplos de consultas utilizando o CQL [7]
Comparação do tempo de inserção entre bancos de dados NOSQL e
relacional [19]
Exemplo de dados estruturados
Exemplo de metadados
4.1
4.2
4.3
4.4
4.5
4.6
Relações, atributos e predicados da relação Vendas.
Relações, atributos e predicados da relação Cliente.
Consultas SQL construídas para cada relação.
Relação Cliente criada no depósito Resultados.
Relação Vendas criada no depósito Resultados.
Resultado da consulta inicial executada no depósito Resultados.
50
51
51
51
51
52
5.1
5.2
5.3
5.4
Tabela de requisitos funcionais do protótipo
Tabela de requisitos não funcionais do protótipo
Configuração dos metadados de conexão no depósito Metadados
Conjunto de relações, coleções de documentos e famílias de colunas para
os experimentos.
54
54
59
Dados armazenados na coleção de documentos Clientes
Dados armazenados na coleção de documentos CondPag
Dados armazenados na coleção de documentos Fornecedor
Dados armazenados na família de colunas vendas
Dados armazenados na família de colunas ItensVendas
Dados armazenados na relação Produto
Dados armazenados na relação Funcionarios
Dados armazenados na relação EntradaNFe
Dados armazenados na relação ItensEntrada
83
84
84
85
89
89
90
90
93
3.2
3.3
A.1
A.2
A.3
A.4
A.5
A.6
A.7
A.8
A.9
23
27
29
31
32
60
CAPÍTULO 1
Introdução
Este capítulo contextualiza o tema deste trabalho, a motivação, os objetivos e
desafios encontrados. A seção 1.1 apresenta a contextualização. A seção 1.2 discute os
objetivos do trabalho. A seção 1.3 apresenta as principais necessidades identificadas
durante a pesquisa. A seção 1.4 descreve as motivações para realização deste trabalho.
A seção 1.5 discute os desafios encontrados durante a pesquisa. A seção 1.6 apresenta
as restrições para o método proposto. E por fim, a seção 1.7 apresenta a organização do
texto.
1.1
Contextualização
Os mecanismos de busca utilizados na Web (World Wide Web) tornaram-se uma
importante alternativa para as pessoas encontrarem diversas informações que necessitam,
desde a busca por uma letra de música, amigos em redes sociais, até uma pesquisa
bibliográfica para uma tese de doutorado. Um usuário pode obter resultados de consultas
em diversos formatos, tais como tabelas, texto, páginas da Web, fotos e outros. Rout et
al. [32] comentam sobre a quantidade de dados disponíveis na Web. De acordo com as
pesquisas, a quantidade de dados estão na esfera de petabytes ou exabytes, que consiste
em trilhões de registros de milhões de usuários. Todos estes dados são originados de
páginas daWeb, dados de vendas de produtos, dados de dispositivos móveis e outros.
Os dados manipulados em aplicações podem estar na forma estruturada, que é
um tipo de dado com a mesma estrutura, armazenados em um repositório com modelo de
dados definido e permitindo relacionamentos [28]. Por outro lado, também podem estar na
forma não estruturada [35], [12], [41], que são dados contidos em arquivos como vídeos,
fotos, documentos de texto, páginas da Web, e para os quais não há uma definição do
modelo e da estrutura de armazenamento [12].
Durante anos, os bancos de dados relacionais foram utilizados como solução no
armazenamento de dados em diferentes cenários [17], em que uma das características
principais é o uso da linguagem SQL para interagir com os banco de dados. Hecht e
Jablonski [14] argumentam que, mesmo não sendo indicado em alguns contextos, bancos
1.1 Contextualização
2
de dados relacionais são utilizados para armazenar os diversos tipos de dados manipulados
pelas aplicações. Stonebraker et al. [37] argumentam que, inicialmente, os bancos de
dados relacionais foram arquitetados com as características de hardware diferentes às
atuais, além de serem desenvolvidos com base em processamento de dados de negócios.
Entretanto, nos últimos 25 anos, uma série de outras áreas evoluíram, por exemplo, data
warehouse. Esses mercados exigem necessidades diferentes às encontradas em dados
comerciais.
A abordagem NOSQL surgiu com a proposta de oferecer recursos diferentes no
armazenamento de dados, baseando-se nas características encontradas em ambientes Web
[45], no qual se encontra uma grande massa de dados, podendo apresentar diferentes formatos e serem acessados por vários usuários simultaneamente. Algumas características da
abordagem NOSQL são: esquema flexível, alta disponibilidade e escalabilidade horizontal [14], [13], [25]. Existem, no entanto, recursos importantes que não estão disponíveis
em bancos de dados NOSQL, como a linguagem de consulta SQL. Em vez disso, cada
banco de dados NOSQL oferece API própria para manipulação de dados [29].
Parker et al. [28] argumentam que os dados gerados em aplicações, mesmo sendo
dados estruturados, não são, obrigatoriamente, armazenados em bancos de dados relacionais. A utilização de bancos de dados dessa abordagem está associada com o ambiente
em que será implantada a aplicação, se haverá uma grande massa de dados sendo acessada simultaneamente, se haverá necessidade de executar consultas complexas com os
bancos de dados, entre outras características. Entretanto, os dados podem ser do tipo não
estruturado, e mesmo assim, não há relação em dizer que, obrigatoriamente, serão armazenados em bancos de dados NOSQL [28]. É possível armazenar dados estruturados em
bancos de dados NOSQL, no entanto, os bancos de dados dessa abordagem armazenam
os dados em um esquema flexível, podendo armazenar dados com diferentes formatos,
além de não fornecerem as propriedades ACID (atomicidade, consistência, isolamento e
durabilidade), o que proporciona melhor desempenho no acesso e manipulação dos dados
[28].
Com um volume cada vez maior de dados disponíveis através da rede mundial,
surgem cenários em que os dados de uma mesma aplicação estão distribuídos em diversas
fontes de dados [38], especificamente em bancos de dados relacionais ou bancos de
dados NOSQL. Zhang et al. [45] apontam um exemplo em que uma aplicação consome
informações de bases relacionais e NOSQL. Parte dos dados pode conter uma estrutura
definida, sobre os quais pode ser necessário realizar consultas com maior complexidade
e precisão, garantir a consistência e integridade dos dados [45], [18]. Neste contexto,
a utilização de bancos de dados relacionais é recomendada. No entanto, uma grande
massa de dados pode estar disponível para ser acessada por usuários simultaneamente,
e, neste caso, podem ser parcialmente irrelevantes aspectos de consistência, integridade,
1.2 Objetivos
3
durabilidade dos dados, e mais importante um menor tempo de consulta, disponibilidade
da aplicação e flexibilidade no armazenamento dos dados [25], [19], [28], [14], [17].
Nesses cenários, a utilização de um banco de dados NOSQL é recomendada.
No cenário citado em Zhang et al. [45], pode ser necessário submeter uma
consulta, requisitando dados distribuídos em bancos de dados relacionais e NOSQL,
e ainda, os bancos de dados podem estar distribuídos geograficamente entre várias
organizações ou até mesmo em várias cidades [41].
Neste contexto, este trabalho apresenta um método capaz de consultar dados
armazenados em bancos de dados relacionais e NOSQL, através de uma única consulta
escrita no padrão da linguagem de consulta SQL, e apresentar o resultado de forma
unificada. Em busca de criar um mecanismo único de acesso aos dados, considerando que
os bancos de dados NOSQL não apresentam um padrão de linguagem de consulta, e para
viabilizar o uso da linguagem SQL como padrão de consulta, todos os bancos de dados
disponíveis são descritos por um conjunto previamente estabelecido de metadados, e, para
todos os bancos de dados, deve ser disponível um driver JDBC. Os bancos de dados
NOSQL são representados na forma de relações e atributos, à semelhança da abordagem
relacional.
De acordo com [26], atualmente estão disponíveis aproximadamente 150 bancos
de dados NOSQL, que compartilham algumas características semelhantes, porém oferecem muitos recursos diferentes. O presente trabalho não apresenta um método geral,
que envolva todos os bancos de dados NOSQL existentes, mas se restringe ao estudo de
bancos de dados NOSQL das categorias orientada a colunas e documentos. A categoria
orientada a colunas se deve ao fato de sua estrutura de armazenamento ser comparada a
bancos de dados relacionais, armazenando os dados em uma estrutura composta de linhas
e colunas. A categoria orientada a documentos se justifica por armazenar os dados em
uma estrutura diferente à orientada a colunas e relacionais, o que torna possível avaliar o
método utilizando outras estruturas de armazenamento NOSQL.
1.2
Objetivos
Considerando um ambiente contendo dados armazenados em bancos de dados
relacionais e NOSQL, o primeiro objetivo deste trabalho é apresentar um método capaz
de permitir que vários bancos de dados de diferentes abordagens sejam acessados a partir
de uma única consulta escrita no padrão SQL e os resultados parciais obtidos em cada
banco de dados sejam mesclados e apresentados de forma unificada.
O segundo objetivo da pesquisa é a utilização dos recursos disponíveis em bancos
de dados relacionais e NOSQL por uma mesma aplicação. As duas abordagens de bancos
1.3 Principais necessidades
4
de dados oferecem maneiras diferentes de manipulação de dados, o que torna um desafio
a integração dessas duas abordagens na mesma aplicação.
O terceiro objetivo está associado ao estudo de uma nova abordagem de banco
de dados. A abordagem NOSQL, em comparação à abordagem relacional, é ainda pouca
estudada e fundamentada. Com a pesquisa direcionada para esta abordagem, é possível
contribuir com os estudos sobre NOSQL, podendo, ainda, identificar técnicas empregadas
para resolução de outros problemas referentes à integração de dados, além de suprir as
necessidades encontradas durante a pesquisa.
Os objetivos específicos do trabalho a fim de alcançar os objetivos gerais são:
•
•
•
•
1.3
Estudo dos bancos de dados NOSQL e suas formas de executar consultas.
Verificar a forma de acesso aos bancos de dados NOSQL.
Identificar um padrão de acesso a dados em bancos de dados relacionais e NOSQL.
Estudo de técnicas de integração de dados já existentes.
Principais necessidades
Zhang et al. [45] propôs um método com o qual é possível realizar a integração
de dados entre bancos de dados relacionais e NOSQL (essa integração é discutida no
Capítulo 2). Entretanto, algumas necessidades não abordadas naquele trabalho foram
encontradas, que são:
• Permitir executar consultas contendo elementos de agregação e consequentemente
o uso das cláusulas group by e having.
• Permitir executar consultas contendo junções.
• Permitir que os atributos da consulta sejam informados sem identificar a relação ao
qual pertence.
• Detalhar todo o processo do método de integração de dados para viabilizar a
reprodução do trabalho.
1.4
Desafios encontrados
Durante o desenvolvimento desta pesquisa, vários obstáculos e desafios foram
encontrados:
• O trabalho empregado como principal referência para o presente trabalho não define
claramente quais as técnicas desenvolvidas para alcançar o objetivo proposto.
• Não foram encontradas implementações que tratam do assunto de integração de
dados com as características abordadas nesta pesquisa.
1.5 Restrições do método proposto
5
• As implementações de bancos de dados NOSQL não fornecem um mecanismo
padrão de comunicação. Cada banco de dados oferece maneiras diferentes de acesso
aos dados, o que dificulta a criação de um mecanismo homogêneo de integração.
1.5
Restrições do método proposto
O método proposto neste trabalho permite implementar as necessidades estudadas nesta pesquisa, como a integração de dados armazenados em bancos de dados relacionais e NOSQL, utilização de junções, agregações e outros elementos, em consultas que
não são reconhecidas pela abordagem NOSQL, e apresenta, de forma detalhada, todos os
processos executados. No entanto, não tem a pretensão de resolver todos os problemas
e/ou necessidades existentes referentes à integração de dados. As restrições do método
proposto são apresentadas nessa seção.
• Normalmente, as consultas SQL são construídas contendo relações, atributos e
outros elementos disponíveis na linguagem de consulta SQL. Algumas palavraschaves são utilizadas nos comandos SQL, na cláusula select e na cláusula where,
a fim de obter resultados diferentes em comparação com uma consulta padrão
(consultas sem elementos de agregação e junção, por exemplo). Os elementos que
são reconhecidos pelo método são: group by, having, order by, join (e variações),
sum, count, max, min, avg, >, <, =, >=, <=, <>, and, or, in.
Os elementos citados anteriormente são fornecidos pela linguagem de consulta
SQL e, portanto, qualquer banco de dados que utilize esta linguagem de consulta
poderá fazer uso desses recursos. No entanto, alguns bancos de dados implementam
funções próprias para obtenção de resultados diferentes. Por exemplo: a função
top, que é implementada pelo banco de dados MSSQL Server, tem a função de
limitar a quantidade de registros que são retornados por uma consulta. No banco
de dados Postgresql, essa mesma tarefa é executada pela função limit. No banco de
dados Oracle, essa funcionalidade é representada pela função rownum. Portanto,
as especificidades de cada banco de dados não são contempladas pelo método
proposto.
• O método proposto não considera aspectos como: escalabilidade, desempenho,
grande massa de dados sendo manipulados por vários usuários simultaneamente
e outras características encontradas em ambientes que lidam com várias fontes de
dados.
1.6 Organização do texto
1.6
6
Organização do texto
Após este capítulo que apresentou a contextualização, a motivação, as necessidades identificadas durante a pesquisa e os objetivos da pesquisa, o trabalho contém ainda
outros 6 capítulos. O capítulo 2 discute os trabalhos relacionados ao tema da pesquisa.
São considerados os trabalhos relevantes que, de alguma maneira, tratam do assunto de
integração de dados entre bancos de dados relacionais e bancos de dados NOSQL. O capítulo 3 aborda os fundamentos técnicos que são necessários à compreensão do contexto
em que a pesquisa foi realizada. O capítulo 4 apresenta o método proposto a fim suprir as
necessidades identificadas durante a pesquisa, além de apresentar a definição do escopo
do projeto. O capítulo 5 apresenta a estrutura do protótipo que foi desenvolvido a fim demonstrar a viabilidade do método proposto. Além disso, apresenta os resultados obtidos
através da utilização do protótipo. E para finalizar, o capítulo 6 expõe as conclusões que
foram obtidas no desenvolvimento do trabalho e trabalhos futuros.
CAPÍTULO 2
Trabalhos Relacionados
O acesso a dados armazenados em bancos de dados relacionais e NOSQL, por
meio de uma única consulta, é uma necessidade para um crescente número de aplicações.
Os trabalhos discutidos a seguir enfatizam alguns métodos propostos que viabilizam a
integração de dados entre essas duas abordagens de bancos de dados, e a execução de
consultas em bancos de dados NOSQL utilizando a linguagem de consulta SQL, bem
como a forma de acesso aos respectivos bancos de dados.
2.1
Integração de dados entre bancos de dados relacionais e NOSQL
O trabalho de Zhang et al. [45] apresenta um modelo de middleware que controla
a comunicação da consulta SQL de entrada com bancos de dados relacionais e NOSQL.
De acordo com os autores, o middleware é capaz de integrar dados armazenados nos dois
tipos de bancos de dados e, para isso, é necessário configurar os bancos de dados a serem
consultados através de um dicionário de dados, que tem a finalidade de armazenar os
metadados de conexão, como o nome do banco de dados, nome de usuário, senha, porta
de comunicação, além de outros elementos necessários para realizar consultas.
O funcionamento do middleware é ilustrado por meio de uma consulta nos
bancos de dados Oracle e Cassandra, relacional e NOSQL respectivamente. A consulta
fornecida é escrita dentro dos padrões da linguagem SQL. O nome de uma relação é
utilizado para identificar o banco de dados. Assim, para evitar ambiguidades, não é
permitido que bancos de dados do mesmo domínio tenham relações com nomes iguais.
Não é claro, contudo, se o middleware é capaz de executar consultas contendo junções e
outros elementos que não são reconhecidos por bancos de dados da abordagem NOSQL.
A Figura 2.1 apresenta a estrutura do método proposto em [45]. Sua estrutura
foi projetada em três partes. Na camada de aplicação é apresentado o middleware client,
responsável pelo envio de um comando SQL para o middleware server. O middleware
server recebe a consulta SQL e extrai cada elemento que compõe a consulta (relações,
2.1 Integração de dados entre bancos de dados relacionais e NOSQL
8
Figura 2.1: Middleware de integração de dados criado em [45]
atributos e predicados). Em seguida, é realizada uma consulta ao dicionário de dados para
verificar qual banco de dados mantém uma determinada relação informada na consulta.
Em seguida, são construídas novas consultas SQL, sendo uma para cada banco de dados
envolvido na consulta. Em razão de bancos de dados NOSQL não fornecerem padrões de
consultas, o módulo SQL engine realiza a conversão de um comando SQL para o padrão
aceito em bancos de dados NOSQL. O SQL processor é responsável por preparar, analisar
e enviar para os bancos de dados o comando SQL solicitado. O Result Set Handler recebe
os resultados parciais gerados em cada banco de dados e apresenta o resultado de forma
unificada.
Os resultados produzidos neste trabalho tem o objetivo de avaliar o desempenho
de uma aplicação sem a utilização do método proposto e com a utilização do método
proposto, não sendo citados experimentos realizados para avaliar a integração dos dados.
Alguns aspectos do método proposto em [45] diferem do método proposto neste
trabalho: na cláusula select da consulta SQL inicial, os atributos devem ser escritos no
formato relação.atributo. No método proposto neste trabalho, pode-se informar apenas o
atributo. Além disso, o método proposto neste trabalho permite executar consultas envolvendo duas categorias de bancos de dados NOSQL (orientados a colunas e documentos),
além de permitir executar consultas com junções e elementos de agregação em bancos de
dados NOSQL.
O trabalho de Lawrence [17] aborda a integração de dados entre bancos de dados
relacionais e NOSQL. A contribuição do trabalho é propor uma interface de consultas
2.2 Integração de dados entre bancos de dados relacionais e outras fontes de dados
9
SQL que é capaz de traduzir a consulta SQL inicial no padrão da API de cada banco de
dados e executar a consulta. Para uma consulta em banco de dados relacional é aplicado
um módulo que valida os atributos e as relações da consulta. De acordo com o autor,
por não fornecer uma padronização e não armazenar os dados em um esquema definido,
para consultas em banco de dados NOSQL, a validação é realizada durante a execução da
consulta. O autor afirma ser possível realizar consultas com vários operadores, tais como:
join, group by, order by e having.
A partir de uma consulta SQL de entrada contendo relações do banco de dados
MySQL e MongoDB, são criadas novas consultas SQL para cada relação informada na
consulta inicial. Essas consultas são executadas separadamente em cada fonte de dados
com o auxilio da API JDBC. Para processar o resultado final da consulta, se as relações
da consulta de entrada estiverem armazenadas no banco de dados MySQL, a consulta de
entrada é executada neste banco de dados. Se as relações da consulta de entrada estiverem
armazenadas no banco de dados MongoDB, a consulta é executada neste banco de dados
e as junções são executadas em uma camada denominada Virtualization Layer.
O método proposto identifica o banco de dados em que cada relação está
armazenada, colocando como prefixo em cada relação na cláusula from o nome do banco
de dados, por exemplo: select nome from mysql.Cliente. A maneira como é realizada
a conexão com os bancos de dados e possíveis metadados utilizados para executar a
conexão não são explicados pelo autor. Neste aspecto, há uma diferença entre o trabalho
de Lawrence e o método proposto neste trabalho: no método proposto, o banco de dados é
identificado através de um conjunto de metadados de conexão previamente configurados,
não sendo necessário conhecer o banco de dados e sua localidade em que as relações estão
armazenadas.
A avaliação desta proposta foi realizada por meio de operações de consulta nos
bancos de dados já mensionados, sobre os quais foram realizados testes de desempenho.
Os testes realizados indicam que, com a utilização do método proposto, houve um
aumento de menos de 15% no tempo de consulta na maioria das operações realizadas,
em comparação ao tempo de consulta executada diretamente no MongoDB, exceto na
operação de inserção, em que obteve um resultado maior em relação ao tempo de consulta
utilizando o método proposto.
2.2
Integração de dados entre bancos de dados relacionais e outras fontes de dados
Alguns métodos para integração de dados entre diferentes fontes de dados são
propostos por diversos autores, mas não abordam especificamente bancos de dados
2.2 Integração de dados entre bancos de dados relacionais e outras fontes de dados
10
relacionais e NOSQL. Entretanto, é relevante mensionar alguns trabalhos que propõe
integração de dados com outras fontes de dados, a fim de apresentar técnicas que foram
utilizadas para realizar a integração e que foram aplicadas no método proposto neste
trabalho.
O trabalho de Kozlova et al. [16] aborda o processamento integrado de consultas
em bancos de dados relacionais e bancos de dados XML. O método proposto é construído com base em outro trabalho desenvolvido pelos mesmos autores, em que foi implementada uma ferramenta chamada SQXML para validar o método proposto. O problema
aborda um contexto em que uma consulta inicial do usuário, no formato XML ou SQL, é
enviada para bancos de dados relacionais ou XML. Os autores argumentam a importância
de se construir uma visão, com base nos bancos de dados, para cada tipo de informação
gerada no processamento da consulta. O método é capaz de converter um comando SQL
inicial em novas consultas no formato XML ou SQL, que são encaminhadas para cada
banco de dados de dados. Os resultados obtidos em cada banco de dados são tratados pelo
método proposto a fim de apresentar uma única resposta.
O funcionamento do método estabelece a seguinte lógica: a partir da consulta
inicial, um módulo denominado Query Process Component executa os procedimentos
para identificar os atributos e as relações. Em seguida, são construídas novas consultas
SQL, uma para cada banco de dados, para serem utilizadas na construção da visão SQL e
XML. As consultas construídas são convertidas no formato SQL e XQuery e são enviadas
para cada banco de dados. Os resultados obtidos em cada banco de dados são retornados
para o componente Query Process Component. Os resultados obtidos em um banco de
dados XML são enviados para uma relação temporária em banco de dados relacional. No
fim do processo, os dados são apresentados de forma unificada.
Su et al. [38] abordam o problema dos diferentes tipos de dados que são gerados
pelas aplicações e os diferentes tipos de bancos de dados existentes que manipulam os
dados.
Os autores propõem um middleware que é capaz de interagir com vários bancos
de dados e realizar a integração de dados entre bancos de dados relacionais e fontes de
dados XML. No entanto, os autores citam alguns desafios que são encontrados ao tentar
resolver esse problema: as fontes de dados normalmente não são apenas estruturadas;
cada banco de dados usa sua própria maneira de manipular os dados; a integração de
dados requer um modelo de dados em comum para facilitar a manipulação de diferentes
tipos de dados; o ambiente do usuário é dinâmico; várias soluções de integração de dados
necessitam de interação com o usuário.
Para permitir que os bancos de dados sejam acessíveis, o método permite o
registro de metadados de conexão dos bancos de dados (XML ou relacional). Para bancos
de dados relacionais, são aceitos os metadados: tipo (relacional ou XML), nome do
2.2 Integração de dados entre bancos de dados relacionais e outras fontes de dados
11
SGBD, nome do banco de dados, endereço IP, porta de comunicação, usuário e senha do
banco de dados. Para bancos de dados XML, são aceitos os metadados: tipo (relacional
ou XML), nome do documento XML que representa o banco de dados, endereço IP do
servidor.
Para realizar uma consulta, a aplicação realiza os seguintes procedimentos: é
feita a análise da consulta inicial para identificar palavras-chaves, nomes de relações, atributos e predicados. Em seguida, são agrupados os atributos e predicados de cada relação,
criando novas consultas SQL. Após esse procedimento, as consultas são transformadas
no padrão desejado, por exemplo: se a consulta for para um banco de dados relacional,
a consulta é executada diretamente no banco de dados; se a consulta for executada em
fontes XML, é feita a transformação da consulta no padrão da linguagem XQuery. Após
esses procedimentos, os resultados obtidos em cada consulta são integrados em um único
resultado final através de um documento XML.
O trabalho de Calil e Dos Santos [4] aborda a execução de comandos DML (inserir, alterar, excluir e consultar) em um banco de dados NOSQL orientado a documentos,
chamado SimpleDB, utilizando a linguagem de consulta SQL.
Para criar uma interface relacional para o banco de dados SimpleDB, é feito um
mapeamento dos elementos que compõe a estrutura de um banco de dados relacional para
a estrutura do banco de dados SimpleDB. Esse mapeamento é utilizado em vários processos para converter um elemento SQL em um elemento do banco de dados SimpleDB.
Estrutura relacional e SimpleDB
Relacional
SimpleDB
Esquema
Domínio
Relação
-
Tupla/Linha
Item
Atributo
Atributo chave
Valor
Valor do atributo
Chave primária
Nome do item
Tabela 2.1: Mapeamento da estrutura de um banco de dados relacional para o banco de dados SimpleDB [4].
A Tabela 2.1 apresenta o mapeamento desenvolvido pelos autores para relacionar
os elementos contidos em um banco de dados relacional com o banco de dados SimpleDB.
A estrutura do método proposto é apresentado na Figura 2.2. Os módulos que
compõe a estrutura do método proposto são: Access Interface, Command Decomposition
e Processing and Return.
• Access Interface: este processo é composto por dois métodos: ExecuteQuery, que
retorna um resultado em formato de tabela, e ExecuteNonQuery, que retorna um
2.2 Integração de dados entre bancos de dados relacionais e outras fontes de dados
12
Figura 2.2: Estrutura do método criado em [4].
texto (string) como resultado. Em operações de inserção, alteração e exclusão,
é utilizado o segundo método; para operação de consulta, é utilizado o primeiro
método. A operação de consulta permite a utilização de junção, mas não permite
agrupamento e subconsultas. Se a consulta é composta por junção, os atributos
devem ser precedidos pelo nome da relação (ex.: relação.atributo).
• Command Decomposition: este processo é responsável por segmentar o comando
SQL e converter os elementos SQL para o formato do SimpleDB. Para uma operação de consulta, são extraídos os elementos: atributos, relações, junções e predicados, porém, os autores não comentam onde são armazenados esses elementos
temporariamente.
• Processing and Return: este processo é responsável por executar o comando SQL
no SimpleDB. Em operações de consulta, se houver mais de uma relação referenciada através de junção, são criadas novas consultas, uma para cada relação da consulta inicial, composta pelos atributos e condições específicas de cada relação. Os
resultados processados em cada relação são mesclados usando as chaves estrangeiras do modelo relacional e o resultado final é fornecido no formato de tabela.
Os resultados obtidos através de experimentos avaliam o desempenho das operações de inserção e consulta. Na inserção, é avaliado o tempo gasto para inserir um grande
volume de dados. Na consulta, é avaliado o tempo gasto para executar diferentes consultas
em termos de complexidade.
• Nas operações de consulta, houve um aumento de aproximadamente 40% no tempo
de processamento, em comparação ao tempo gasto em executar diretamente no
SimpleDB. De acordo com os autores, era esperada essa diferença no tempo, pois
o método proposto processa dados consultados em bancos de dados nas nuvens e
converte para o esquema relacional.
• Nas operações de inserção, houve um aumento de aproximadamente 5% no tempo
de processamento, em comparação ao tempo gasto em executar diretamente no
SimpleDB. De acordo com os autores, esse aumento no tempo não é um obstáculo
para adotar o método proposto.
2.2 Integração de dados entre bancos de dados relacionais e outras fontes de dados
13
O trabalho de Dos Santos et al. [10] aborda a execução de comandos DDL (criar,
alterar e excluir relações) em um banco de dados NOSQL orientado a documentos chamado SimpleDB, utilizando a linguagem de consulta SQL. Os autores citam a necessidade
de se utilizar os recursos oferecidos pela linguagem de consulta SQL em conjunto aos recursos oferecidos pelos bancos de dados NOSQL, sem afetar o desempenho da aplicação.
O método proposto é uma evolução daquele discutido em [4], que agora permite executar
os dois tipos de comandos SQL, tanto DML quanto DDL.
O método desenvolvido em [10] é chamado de SimpleSQL e pode receber um
comando DDL, converter para a estrutura do banco de dados SimpleDB e executar o
comando. Para isso, a estrutura de um banco de dados relacional é mapeada para a
estrutura do banco de dados SimpleDB, conforme a Tabela 2.1.
Para iniciar a execução do método, o comando DDL é recebido pelo módulo
Access Inteface, que é responsável por identificar o comando SQL. Após esse procedimento, o módulo Command Translation identifica o banco de dados, relações, colunas e
restrições do comando inicial a fim de mapear os elementos SQL para o SimpleDB. De
acordo com os autores, esse mapeamento é realizado com base em expressões regulares,
que tem o objetivo de validar a sintaxe do comando a ser processado e extrair os elementos correspondentes para o SimpleDB. Por fim, o módulo Processing and Return recebe
os dados e o comando a ser processado e os envia ao SimpleDB. O resultado da operação
executada é encaminhada para o módulo Access Interface e posteriormente enviada para
a aplicação. A estrutura do método é apresentada na figura 2.3.
Figura 2.3: Estrutura do método desenvolvido em [10].
Os experimentos realizados pelos autores avaliaram o tempo de processamento
da execução de comandos DDL com a utilização do método proposto. Os resultados
apontam que, com a utilização do SimpleSQL, o tempo de execução de comandos DDL
é satisfatório, em comparação com a execução de comandos através do SimpleDB. Em
2.2 Integração de dados entre bancos de dados relacionais e outras fontes de dados
14
operações de criação de relações, por exemplo, houve um aumento no tempo de execução
do comando, porém, inferior a 34%, em comparação ao tempo de execução do comando
no SimpleDB. Em operações de atualização e exclusão de relações, o tempo de execução
dos comandos foi inferior a 15%.
Chung et al. [9] abordam as mudanças ocorridas nos meios de armazenamento,
em que os bancos de dados relacionais são utilizados em grande parte das situações pra
manipular dados.
É proposto um mecanismo em que é submetida uma consulta SQL para ser
executada por bancos de dados NOSQL. O método proposto permite a execução apenas
de consultas e em apenas um banco de dados NOSQL, no caso, HBase. Para controlar
o acesso ao banco de dados HBase, é utilizada a API JDBC. Para processar os dados, é
utilizada a técnica MapReduce, que tem a função de processar dados não estruturados no
banco de dados NOSQL.
Para criar um modelo semelhante às duas abordagens (estruturada e NOSQL),
é feito um mapeamento da estrutura do relacional para a estrutura do HBase. Para isso,
são configurados os metadados de armazenamento no banco de dados relacional Derby.
Os metadados configurados são: o nome da tabela, o nome da família de colunas e das
colunas do HBase.
Os passos executados para submeter uma consulta e receber o resultado são:
1. Submeter a consulta no padrão ANSI-SQL através de uma aplicação cliente que
ofereça a utilização da linguagem SQL (neste trabalho foi utilizado o SQuirreL).
2. Analisar e mapear a consulta.
3. Encontrar o nome da tabela, família de colunas e colunas do HBase.
4. Gerar o MapReduce de acordo com a consulta e os metadados.
5. Acessar o HBase e executar o MapReduce.
6. Apresentar os resultados.
O método proposto foi avaliado através da execução de várias consultas SQL
contendo vários elementos não executados de forma nativa pelos bancos NOSQL (sum,
group by e outros). Os experimentos consideram o tempo de execução de consultas
utilizando o método proposto, Hive e MySQL. Os experimentos foram executados em um
ambiente contendo dados entre 100GB e 700GB de tamanho, utilizando consultas com
select, between, like, group by, group by, order by e join. De acordo com os resultados
obtidos, o método proposto supera, em tempo de execução das consultas, o Hive e
MySQL, em todas as consultas, exceto as consultas envolvendo join, sendo inferior apenas
ao MySQL.
O trabalho de Duggan et al. [11] aborda uma nova visão de bancos de dados
federados com a crescente necessidade de gerenciamento de informações que abrange
vários modelos de dados.
2.2 Integração de dados entre bancos de dados relacionais e outras fontes de dados
15
A partir dos trabalhos relacionados com a proposta deste trabalho, foi criada uma
tabela que apresenta algumas caracteristicas que diferenciam os trabalhos apresentados
nesta seção e o método proposto neste trabalho.
Zhang et al.
[45]
Lawrence
[17]
Kozlova et
al. [16]
Su et al. [38]
Calil e Dos
Santos [4]
Dos Santos
et al. [10]
Chung et al.
[9]
Método proposto 2015
Sim
Sim
Não
Não
Não
Não
Sim
Sim
Sim
Sim
Sim
Não
Não
Não
Sim
Utiliza
JDBC
Acessa
vários
bancos
Sim
metada-
Sim
Sim
Não
Não
Não definido
Não definido
Não definido
Não definido
Sim
Não
Não
Sim
Não definido
Sim
Não definido
Não
Sim
Não
Não
Não
Não
Não definido
Não
Conhecimento Conhecimento Várias
prévio BD
prévio rela- categorias
ção
NOSQL
Não
Sim
Não
Tabela 2.2: Características dos trabalhos relacionados
Não definido
Sim
Não definido
Não
Sim
Sim
Usa
dos
Não
Não
Não
Sim
Não
Não
Não
Consulta
préprocessada
Não
Sim
Sim
Sim
Não definido
Sim
Não definido
Sim
Não
Permite Join
Sim
Sim
Não
Não definido
Não
Não definido
Sim
Elementos
de
agregação (sum,
count...)
Não
2.2 Integração de dados entre bancos de dados relacionais e outras fontes de dados
16
2.2 Integração de dados entre bancos de dados relacionais e outras fontes de dados
17
A Tabela 2.2 apresenta os elementos que foram utilizados para comparar os
trabalhos apresentados nesta seção com o método proposto neste trabalho.
• Acessa vários bancos: o método proposto permite acessar vários bancos de dados
a partir da consulta de entrada.
• Utiliza JDBC: o método proposto utiliza driver JDBC específico de cada banco de
dados envolvido na consulta de entrada.
• Usa metadados: o método proposto utiliza o mecanismo de configuração prévia de
metadados de conexão.
• Conhecimento prévio BD: o método proposto identifica o banco de dados que
mantém uma relação a partir de um indicativo do banco de dados (nome do banco
ou algo que o identifica), precedendo-o em uma relação na consulta de entrada.
• Conhecimento prévio relação: o método proposto exige preceder o nome do
atributo com o nome da relação a qual pertece.
• Várias categorias NOSQL: o método proposto permite acessar várias categorias
de bancos de dados NOSQL a partir de uma única consulta SQL de entrada.
• Consulta pré-processada: a consulta de entrada não é informada no padrão SQL.
• Permite Join: o método proposto permite utilizar, na consulta SQL de entrada,
operação de junção.
• Elementos de agregação (sum, count...): o método proposto permite utilizar, na
consulta SQL de entrada, elementos de agregação.
CAPÍTULO 3
Fundamentação teórica
Este capítulo apresenta os conceitos, estruturas e modelos de bancos de dados
relacionais, bancos de dados NOSQL e outros assuntos necessários ao entendimento deste
trabalho.
3.1
Modelo relacional
Por se tratar de um modelo de dados bastante testado, documentado e fundamentado, não será feita uma abordagem profunda nas teorias do modelo relacional.
O modelo relacional é caracterizado por descrever os dados em uma estrutura
chamada esquema. No modelo relacional, o esquema especifica as relações, os atributo e
o tipo de dado ou domínio de cada atributo [31]. Os dados são armazenados em relações,
as quais são compostas por um conjunto de tuplas. Os dados podem ser armazenados em
múltiplas relações, permitindo executar consultas relacionando várias relações através de
junções [28], [15]. Os bancos de dados que são originados desse modelo são conhecidos
como bancos de dados relacionais.
Os bancos de dados relacionais utilizam a linguagem de consulta SQL, que
permite o acesso e a manipulação de dados. A linguagem de consulta SQL contém
elementos que permitem a criação, alteração, exclusão e consulta de dados nos bancos
de dados. Além disso, fornece uma sintaxe padrão que auxilia o acesso e manipulação
dos dados [31], [15].
Um dos recursos importantes do modelo relacional, e que o difere de outros
modelos, são as propriedades ACID [31], que é o acrônimo de atomicidade, consistência,
isolamento e durabilidade. Essas propriedades asseguram a consistência e a integridade
dos dados, além de oferecer recursos de transação entre a aplicação e o banco de dados
[24], [15], [21]. Em casos específicos, o controle de transação é importante, como em
sistemas bancários, em que se deve garantir a integridade dos valores gerados por uma
transação [29].
Os bancos de dados relacionais são utilizados em grande parte das aplicações,
por se tratar de um modelo bastante estudado, matematicamente fundamentado e utilizado
3.1 Modelo relacional
19
amplamente para o armazenamento de dados. Aplicações que priorizam a consistência dos
dados, controle de transações, consultas que envolvam operadores de agregação, soma,
contagem, junções e outras características, utilizam os bancos de dados relacionais como
fonte de armazenamento. De acordo com Leavitt [18] e Mohamed et al. [21], a abordagem
relacional é utilizada em aplicações de negócios, tais como: bancos, indústrias, empresas
comerciais, em que é necessário obter informações com garantia da consistência dos
dados e consultas com as características citadas.
Existem, entretanto, algumas limitações na utilização de bancos de relacionais
no armazenamento de dados. Os bancos de dados relacionais não são adequados para
lidar com a grande massa de dados gerados na Web, com milhões de acessos simultaneos
[21], [25]. De acordo com Leavitt [18], os dados produzidos por usuários, para serem
armazenados no banco de dados, devem ser convertidos para estrutura de relações. Essa
tarefa se torna difícil e lenta em bancos de dados relacionais, por se tratar de uma estrutura
com um esquema defido. A escalabilidade da aplicação se torna inviável, por distribuir os
dados em servidores com maior poder de processamento e mais caros [25].
Tauro et al. [39] abordam três aspectos principais que resultam à não utilização
de bancos de dados relacionais em alguns tipos de aplicações: (1) o conjunto de dados
disponíveis para ser acessado é cada vez maior; (2) a disponibilidade da aplicação; (3) os
tipos de dados disponíveis, em grande parte, são não estruturados.
Figura 3.1: Tipos de dados gerados nos últimos anos [39].
De acordo com os autores, a quantidade de dados gerados na Web entre os anos
de 2007 e 2010 aumentou em vinte e cinco vezes. A Figura 3.1 apresenta os tipos de
dados gerados nos últimos anos segundo as pesquisas. Na década de 90 eram produzidos
3.2 Abordagem NOSQL
20
na Web apenas documentos de texto e hipertextos. Entre os anos de 2000 a 2010, com
o surgimento da Web 2.0, foram produzidos outros tipos de dados, tais como blogs,
conteúdos de usuários e outros. Atualmente e nos próximos anos, são e serão gerados
dados como ontologias, RDF e outros.
Tauro et al. [39] ainda abordam o problema em utilizar bancos de dados relacionais na manipulação de dados semi-estruturados. Os bancos de dados relacionais possuem
uma estrutura definida, na qual exigem a prévia definição da estrutura de armazenamento,
informando o nome e o tipo do atributo, bem como a quantidade de atributos [18]. Dados
semi-estruturados são dados que possuem atributos não definidos e opcionais. À medida
que as informações aumentam, é necessário aumentar, por exemplo, o número de colunas
de uma relação.
3.2
Abordagem NOSQL
A abordagem NOSQL foi proposta com o objetivo de oferecer novas maneiras
no armazenamento de dados com ênfase no armazenamento de grandes massas de
dados, disponibilidade e escalabilidade da aplicação [25]. Essa abordagem foi proposta
inicialmente em 1999 por Carlos Strozzi, no entanto, passou a se tornar mais conhecida
a partir de 2009, através de Johan Oskarsson, em um evento que discutia bancos de
dados distribuídos e open-source [45]. Desde então, empresas como Google, Facebook
e Amazon passaram a desenvolver suas próprias soluções NOSQL.
Os bancos de dados NOSQL são representados em uma estrutura denominada
esquema, porém, não é necessário sua definição prévia [40]. Nessa abordagem, os dados
são armazenados como um par chave-valor, em que a chave é única e identifica o registro
e o valor representa a informação de uma determinada chave.
Os bancos de dados NOSQL foram projetados para oferecer, prioritariamente,
alta disponibilidade, diferente da abordagem relacional, que prioriza a consistência dos
dados. Alguns bancos de dados NOSQL oferecem a escalabilidade horizontal, em que os
dados são distribuídos em computadores com menor poder de processamento, em vez de
serem distribuídos em um único servidor com maior poder de processamento. Em alguns
casos, bancos de dados NOSQL permitem melhor desempenho de processamento de
operações SQL em comparação com bancos de dados relacionais e se tornam adequados
em aplicações que manipulam grandes volumes de dados, na ordem de zetabytes ou
petabytes [18] [33], [8], [25].
Tudorica e Bucur [40] abordam as principais características e categorias dos
bancos de dados NOSQL. Estes bancos de dados não oferecem relacionamentos entre
os dados, não utilizam a linguagem de consulta SQL para operações com banco de dados,
sendo necessário uma API de comunicação com banco de dados para realizar operação
3.2 Abordagem NOSQL
21
de inserção, alteração, exclusão e consulta de dados. De acordo com as pesquisas, foi
constatado que grande parte dos bancos de dados NOSQL são open-source. Segundo
Lawrence [17], bancos de dados NOSQL foram desenvolvidos para suprir os recursos que
o modelo relacional não oferece, frequentemente envolvendo recursos de processamento
de Big Data.
3.2.1
Modelo de dados
A principal característica que difere o modelo relacional da abordagem NOSQL
é o modelo de dados [14]. A abordagem NOSQL busca oferecer maneiras diferentes para
armazenar os diversos tipos de dados que são gerados ou consumidos pelas aplicações.
Basicamente, todos os bancos de dados NOSQL armazenam os dados em um par chavevalor, porém, disponibilizam estruturas diferentes no armazenamento [14].
3.2.2
Categorias de bancos de dados NOSQL
Os bancos de dados NOSQL são divididos em quatro principais categorias:
chave-valor, orientado a colunas, orientado a documentos e orientado a grafos. Tudorica e
Bucur [40], Cattell [8], Hecht e Jablonski [14], Han et al. [13] são alguns dos autores que
abordam as categorias NOSQL e comentam sobre os bancos de dados de cada categoria.
1. Chave-Valor
É o modelo de dados mais simples, em que cada valor corresponde a uma chave.
Permite armazenamento de grande massa de dados e as modificações nos valores
ocorrem através das chaves [13]. Uma determinada pesquisa pode ser feita apenas
pela chave, pois não é possível agrupar várias chaves em algum tipo de estrutura,
como ocorre em outras categorias NOSQL. Esta categoria permite, além de um
mecanismo de armazenamento: replicação, versionamento, transações, ordenação e
outros recursos [8], [14].
De acordo com [14], por se tratar de um modelo de dados simples, as APIs de
consulta disponíveis para esta categoria não fornecem tantos recursos quanto as
de outras categorias NOSQL, fornecendo apenas os métodos: put, get e delete.
Se é necessário realizar algum tipo de consulta mais complexa, esta deve ser
implementada na aplicação. Portanto, a categoria chave-valor não deve ser utilizada
em casos que envolva consultas complexas. A Figura 3.2 exemplifica a estrutura da
categoria NOSQL chave-valor. Cada linha corresponde a um par <chave,valor>.
Riak, Redis, Scalaris, MemcacheDB são exemplos de bancos de dados chave-valor
[40].
2. Documentos
3.2 Abordagem NOSQL
22
Figura 3.2: Estrutura do banco de dados chave-valor
Este modelo armazena um par chave-documento em um documento JSON ou
XML. Em cada documento, a chave que identifica um valor deve ser única e
contém uma chave especial chamada ID, que também é única, que identifica
o documento explicitamente dentro de uma coleção de documentos [14]. Uma
coleção de documentos compõe um banco de dados. Em cada banco de dados, podese ter tipos diferentes de documentos, documentos aninhados e permite a criação de
índices secundários [8]. CouchDB, MongoDB, OrientDB, RavenDB são exemplos
de bancos de dados NOSQL orientados a documentos [40], [8]. Para exemplificar a
estrutura dos bancos de dados orientados a documentos, será utilizado o banco de
dados MongoDB.
Figura 3.3: Estrutura do banco de dados MongoDB [43]
A Figura 3.4 apresenta a estrutura de armazenamento do MongoDB. Os documentos são compostos por vários atributos, porém, cada atributo é composto apenas
pelo seu valor.
MongoDB é um banco de dados escrito na linguagem C++ e possui algumas
características: a chave que identifica um documento normalmente é a combinação
do ID e um valor timestamp; implementa uma linguagem própria de consulta;
3.2 Abordagem NOSQL
23
oferece técnicas de distribuição de documentos em vários servidores através da
replicação de dados, permitindo master-slave, que é mais utilizado em caso de
falha de leitura ou escrita, e sharding, utilizado para a escalabilidade horizontal,
o que garante a durabilidade dos dados [8], [1]. A Figura 3.3 apresenta a estrutura
básica do banco de dados MongoDB.
Figura 3.4: Exemplo da estrutura de armazenamento do MongoDB
Na abordagem relacional, alguns termos são utilizados para identificar os elementos
que compõe a estrutura dos bancos de dados relacionais. É possível fazer uma
analogia com o MongoDB e mostrar a terminologia empregada nos elementos que
compõe a estrutura do banco de dados.
Termos SQL
Banco de dados
Tabela
Linha
Coluna
Index
Primary Key
Termos MongoDB
Banco de dados
Coleção
Documento ou JSON
Campo
Index
Primary key
Tabela 3.1: Comparação dos termos utilizados em bancos de dados relacionais e MongoDB [22]
A Tabela 3.1 apresenta os termos que são empregados em elementos dos bancos
de dados relacionais e seus correspondentes no banco de dados MongoDB. Alguns
termos, tais como index, primary key e banco de dados tem o mesmo significado em
ambos, enquanto as informações dos registros armazenados (tabela, coluna e linha)
são diferentes.
O banco de dados MongoDB utiliza mecanismos diferentes de manipulação de
dados em comparação aos bancos de dados relacionais. É possível realizar uma
comparação sintática de como é feita a criação de uma relação, inserção e consulta
dos dados em um banco de dados relacional e no banco de dados MongoDB.
3.2 Abordagem NOSQL
24
A Figura 3.5 apresenta uma comparação sintática para criação de uma relação em
um banco de dados relacional e a criação de uma coleção de documentos no banco
de dados MongoDB. Ao criar uma relação chamada users em um banco de dados
relacional, é necessário definir o tipo de dado e outros atributos. No banco de dados
MongoDB, entretanto, não é necessário definir os atributos de cada documento.
Opcionamente, não é necessário criar explicitamente uma coleção de documentos;
ao executar o comando para inserir um documento, a coleção de documentos é
criada automaticamente.
Figura 3.5: Comparação da sintaxe de criação de uma relação em
banco de dados relacional e MongoDB [22]
A Figura 3.6 apresenta a sintaxe utilizada para inserir dados em uma relação do
banco de dados relacional e em um documento no banco de dados MongoDB. Para
inserir dados em um banco de dados relacional, é possível utilizar uma relação
que foi criada, mas não utilizada no momento da criação. No banco de dados
MongoDB, pode-se utilizar uma coleção de documentos já criada ou informar o
nome da coleção de documentos no momento da inserção dos dados.
Figura 3.6: Comparação da sintaxe de inserção de dados em
banco de dados relacional e MongoDB [22]
A Figura 3.7 apresenta a sintaxe para consultar dados em um banco de dados
relacional e em um documento no banco de dados MongoDB. É possível verificar
que o banco de dados MongoDB não utiliza a linguagem SQL para consulta de
dados, mas sim, uma API que realiza as operações com o banco de dados. Assim
como a linguagem SQL oferece a operação select, o banco de dados MongoDB
oferece o método find(), que tem a tarefa de pesquisar os dados dentro de uma
coleção de documentos.
3.2 Abordagem NOSQL
25
Figura 3.7: Comparação da sintaxe de consulta em banco de dados relacional e MongoDB [22]
3. Grafos
Bancos de dados orientados a grafos são especializados em gerenciar dados fortemente ligados. Para aplicações baseadas em dados com relacionamentos, tais como
mapas, serviços de localização, é recomendada a utilização desta categoria de banco
de dados NOSQL [14].
Nesta categoria, os nós e arestas consistem de objetos com atributos chave-valor
embutidos. A quantidade de pares <chave, valor> é definida pelo esquema do banco
de dados, em que uma expressão que envolva restrições de maior complexidade
pode ser descrita facilmente [14].
Em contraste com outras categorias NOSQL, a categoria NOSQL orientado a grafos
oferece algumas linguagens de consulta, tais como SPARQL e Gremlin. Entretanto,
exemplos de bancos de dados que apoiam essas linguagens de consulta são Neo4J
e GraphDB, diferente do FlockDB, que não apoia a utilização destas linguagens de
consulta [14].
Um caso de utilização da categoria NOSQL orientado a grafos é o Twitter. A rede
social armazena vários relacionamentos entre os usuários a fim de fornecer o serviço
de pesquisa de tweets. É utilizado o banco de dados FlockDB para armazenar os
relacionamentos, e, de acordo com [14], é um banco de dados mais simples em
comparação a outros da categoria NOSQL.
Neo4J, InfoGrid, HyperGraphDB, VertexDB são exemplos de orientado a grafos
[40].
4. Colunas
3.2 Abordagem NOSQL
26
A categoria banco de dados orientado a colunas é o modelo que mais se assemelha
com bancos de dados relacionais, que armazena as informações em relações, mas
não permite relacionamentos entre elas. Os dados são armazenados separadamente
em colunas e cada coluna de dados é um índice do banco de dados. As colunas
podem ser agrupadas em famílias de colunas, que permitem sua distribuição em
vários nós, o que torna importante para a organização e particionamento dos dados
[13], [8], [14], [1]. Cassandra, Hypertable, Hbase, Amazon SimpleDB são exemplos
de bancos de dados orientados a colunas [40]. Para exemplificar a estrutura dos
bancos de dados orientados a colunas, será utilizado o banco de dados Cassandra.
Cassandra é um banco de dados escrito em Java, desenvolvido pelo Facebook e
possui algumas características: permite armazenar dados estruturados, semi estruturados e não estruturados; projetado para armazenar grande quantidade de dados.
Quando, em algum cluster, algum nó é adicionado ou removido, os dados são distribuídos automaticamente em todos os nós do cluster [1].
Figura 3.8: Estrutura de armazenamento do banco de dados Cassandra
A Figura 3.8 exemplifica a estrutura de armazenamento do banco de dados Cassandra. É possível identificar que o keypace é responsável por armazenar toda a
estrutura de armazenamento. Uma família de colunas é composta por linhas e cada
linha é formada por colunas e um atributo chave. Em analogia a bancos de dados
relacionais, o keyspace é equivalente ao banco de dados, uma família de colunas
equivale a uma relação e uma coluna é comparada a um atributo [1].
O Cassandra oferece uma linguagem de consulta própria chamada CQL (Cassandra
Query Language), que se assemelha à linguagem SQL, que utiliza o mesmo conceito de estruturação das relações em linhas e colunas [7]. A linguagem CQL não
3.2 Abordagem NOSQL
27
oferece algumas operações com banco de dados, tais como: junções, subconsultas,
agrupamentos e outras operações [7].
Comandos CQL
SELECT * FROM users WHERE firstname = "jane"and lastname="smith";
SELECT * FROM emp WHERE empID IN (130,104) ORDER
BY deptID DESC;
SELECT * FROM emp where empID IN (130,104) ORDER BY
deptID ASC;
SELECT artist, venue FROM playlists WHERE venue CONTAINS "The Fillmore";
Tabela 3.2: Exemplos de consultas utilizando o CQL [7]
A Tabela 3.2 apresenta exemplos de consultas utilizando a linguagem CQL. A
cláusula select permite operações com nomes de atributos, count(*), distinct e
utilização de alias com a expressão as. Na cláusula where, é permitida a utilização
dos elementos: and, in, contains, =, <, >, <=, >=. Na cláusula order by, é permitido
ordenação pelo nome dos atributos especificados na cláusula select e não pelo alias,
contendo as expressões asc e desc. Mais informações sobre a linguagem CQL estão
disponíveis em [6].
Figura 3.9: Exemplo da sintaxe de criação de relações CQL [7]
A Figura 3.9 apresenta a sintaxe de criação de relações no banco de dados Cassandra utilizando a linguagem CQL. A estrutura é semelhante à linguagem SQL,
podendo conter atributos com os seguintes tipos: ascii, bigint, blob, boolean, counter, decimal, double, float, int, text, timestamp, uuid, varchar, varint [6].
A linguagem de consulta CQL é, ainda, bastante estudada e modificada. O site da
API, disponível em [6], contém o histórico das últimas versões da linguagem CQL,
em que é possível identificar que muitos recursos foram afetados na evolução das
versões, não sendo possível afirmar se um determinado recurso estará presente ou
conterá o mesmo nome ou funcionamento da versão anterior.
3.2 Abordagem NOSQL
3.2.3
28
Outras características da abordagem NOSQL
Tudorica e Bucur [40] comentam que algumas categorias de bancos de dados
possuem características da abordagem NOSQL, porém, oferecem alguns recursos de
bancos de dados relacionais, como a utilização das propriedades ACID. Por esse motivo,
de acordo com os autores, tais categorias são ignoradas por vários autores quando
abordam o assunto NOSQL. Essas outras categorias são: bancos de dados orientado a
objetos, bancos de dados em nuvem, bancos de dados XML, bancos de dados multivalor.
Han et al. [13] analisam as classificações da abordagem NOSQL e a origem
da fundamentação da abordagem. Nesse estudo, foi discutido que a abordagem NOSQL
é baseada nas propriedades CAP, que é o acrônimo de consistência, disponibilidade e
tolerância a partição. Essas propriedades foram fundamentadas em 2000, pelo professor
Eric Brewer, com a construção do teorema CAP. De acordo com ele, em ambientes
distribuídos, é possível oferecer apenas duas das três propriedades simultaneamente.
Figura 3.10: Teorema CAP [42]
A Figura 3.10 apresenta o teorema CAP através da união do conjunto DT, CT
e DC. O centro da figura é apresentado sem nenhum indicativo, demonstrando que não
existe a relação das três propriedades. Alguns autores, tais como Wang e Tang [42], Cattell
[8], Abramova e Bernardino [1], Pokorny [29] também abordam em seus trabalhos, entre
vários temas, a fundamentação da abordagem NOSQL por parte do teorema CAP, fazendo
analogias com as propriedades ACID da abordagem relacional.
De acordo com Tauro et al. [39], a principal vantagem da abordagem NOSQL em
relação à abordagem relacional é a facilidade em manipular dados não estruturados, como
documentos, emails, dados multimídia, dados gerados em redes sociais. Os principais recursos oferecidos pelos bancos de dados NOSQL são: alta escalabilidade, disponibilidade,
modelo de dados sem esquema definido.
Li e Manoharan [19] afirmam que, com o aumento de acesso à Internet, aumentou também a quantidade de dados gerados pelas aplicações, e esses dados podem ser do
3.2 Abordagem NOSQL
29
tipo estruturado, semi-estruturado ou não estruturado. Processar esses dados requer alta
velocidade, esquema de dados flexível e bancos de dados distribuídos. De acordo com os
recursos oferecidos, a abordagem NOSQL é a mais indicada para esses cenários.
Leavitt [18] aborda em seu trabalho o tema: organizações que trabalham com
grande quantidade de dados não estruturados estão, cada vez mais, migrando para bancos
de dados NOSQL. É feito um estudo apontando as principais limitações da abordagem
relacional e os motivos pelas quais várias empresas passaram a utilizar bancos de dados
NOSQL no armazenamento de dados. Entre os principais motivos, estão: rápido acesso
aos dados, modelo de dados simples, escalabilidade horizontal, bancos de dados opensource. O autor comenta que os bancos de dados NOSQL não vão substituir os bancos de
dados relacionais, mas sim, oferecer recursos diferentes para serem implementados em
outros tipos de aplicações.
Alguns autores, tais como Li e Manoharan [19], Parker et al. [28], Wei-ping et al.
[43] e Nyati [27] propõem comparações entre os bancos de dados relacionais e NOSQL
em relação ao tempo e velocidade de execução de operações com o banco de dados.
Bancos de dados
MongoDB
RavenDB
CouchDB
Cassandra
Hypertable
Couchbase
MS SQL Express
No de operações
10 50
100 1000
61 75
84
387
570 898 1213 6939
90 374 616 6211
117 160 212 1200
55 90
184 1035
60 76
63
142
30 94
129 1790
10000
2693
71343
67216
9801
10938
936
15588
100000
23354
740450
932038
88197
114872
8492
216479
Tabela 3.3: Comparação do tempo de inserção entre bancos de
dados NOSQL e relacional [19]
A Tabela 3.3 apresenta as análises feitas em [19], com base no tempo de inserção,
em milissegundos, e a quantidade de operações executadas. Foram feitos testes com 6
bancos de dados NOSQL e 1 banco de dados relacional.
Com 10 operações, o banco de dados MSSQL Express se mostrou mais rápido
que todos os outros bancos de dados. Porém, com 100.000 operações, o banco de dados
Couchbase obteve um resultado de tempo de escrita melhor, seguido pelo MongoDB e
Cassandra. De acordo com os autores, nos testes de leitura e escrita, foram constatados
que alguns bancos de dados NOSQL se mostraram mais lentos que o MSSQL Express,
especialmente os bancos de dados RavenDB e CouchDB. Informações como: utilização
de índices, dados em memória e o volume de dados não foram informados pelos autores.
Parker et al. [28] apresenta o resultado das análises feitas com relação ao tempo
de consulta entre SQL e MongoDB através de um campo indexado. Foram executadas
3.3 Dados estruturados e não estruturados
30
operações SQL nos bancos de dados SQL Server e MongoDB e extraído o tempo, em
milissegundos, de execução das operações. O resultado aponta que o tempo de consulta
no banco de dados SQL é maior que no MongoDB. De acordo com os autores, isso se deve
ao fato do MongoDB utilizar campos indexados, no caso ID, e também por processar as
consultas em memória.
Wei-ping et al. [43] apresentam o resultado das análises realizadas nos bancos
de dados MongoDB e MySQL ao executar operações SQL. O resultado foi obtido através
de duas operações, sendo uma operação de inserção e outra de consulta. Na inserção, o
banco de dados MongoDB apresentou um tempo mais satisfatório que no MySQL. Na
consulta, os dois bancos de dados obtiveram um tempo menor que na inserção, porém, o
MongoDB também alcançou um tempo menor que o MySQL.
Os resultados apresentados acima indicam que as operações realizadas em bancos de dados NOSQL são mais rápidas do que em bancos de dados relacionais. No entanto, não se pode afirmar que os bancos de dados que obtiveram resultados mais satisfatórios no tempo de inserção e consulta de dados são melhores do que os menos satisfatórios.
O que deve ser considerado é o ambiente no qual será utilizado o banco de dados, a quantidade de dados envolvidos no processo, o tipo dos dados gerados pela aplicação, o tipo
da aplicação, as operações que os usuários necessitam e quais os recursos que o banco de
dados pode oferecer. Por exemplo: alguns desses testes podem ter sido gerados em uma
aplicação que realmente faz uso de bancos relacionais, e, de fato, obteve um resultado
menos satisfatório do que os bancos NOSQL. Entretanto, para os usuários e os resultados
esperados pela aplicação, o tempo de resposta da operação pode ser irrelevante, visto que
podem ter outros recursos que são oferecidos pelos bancos de dados relacionais e consumidos pelos usuários, e, por esses motivos, os usuários já sabem que a operação retornará
o resultado em maior tempo.
3.3
Dados estruturados e não estruturados
Os tipos de dados manipulados por aplicações na Web se tornaram cada vez
mais diversificados nos últimos anos, devido ao fácil acesso à Web e a disponibilidade
de armazenar dados com baixo custo [19]. No entanto, existem situações nas quais
são disponibilizados formulários de cadastros para interação com o usuário ou são
armazenados os metadados de dados manipulados pelos usuários [3]. Em geral, os dados
podem residir em registros com estrutura definida, que são classificados como dados
estruturados, ou em arquivos contendo texto, música, gráficos, que são classificados como
dados não estruturados [12].
A Tabela 3.4 apresenta a forma como é representado um dado estruturado. O
exemplo mostra um formulário de contato que possui a mesma estrutura semântica,
3.3 Dados estruturados e não estruturados
31
Formulário de Contato
Atributo
Tipo
Valor
Nome
Texto
José Pereira
Endereco
Texto Rua das flores, no 5
Cidade
Texto
São Paulo
Bairro
Texto
Jardim das Flores
Idade Numero
35
Tabela 3.4: Exemplo de dados estruturados
mesmas características, tipos de dados definidos e mesma quantidade de atributos, em
comparação, por exemplo, a dados encontrados em documentos de texto. Independente da
pessoa que se deseja cadastrar, sempre deverá seguir a estrutura especificada. Além disso,
as informações apresentadas nos contatos são organizadas em linhas e colunas, o que torna
adequado armazenar esses dados em bancos de dados relacionais [28]. Dados estruturados
são dados armazenados em uma estrutura predefinida e que podem ser organizadas em
relações, tags ou objetos [12].
Figura 3.11: Exemplo de dados não estruturados
A Figura 3.11 exemplifica como são encontrados dados não estruturados em um
documento de texto. Neste exemplo é utilizada a localização da palavra "consulta", em
que é possível verificar que todas as palavras e expressões não possuem uma estrutura
definida, sendo distribuídas livremente no texto.
O conceito de dados não estruturados pode ter vários significados dependendo
do contexto em que está sendo empregado. Blumberg e Atre [3] argumentam que no
contexto de bancos de dados relacionais, dados não estruturados são dados que não podem
ser armazenados em linhas e colunas. Em vez disso, os dados devem ser armazenados
num tipo BLOB (binary large object). No contexto de dados gerados e consumidos por
aplicações na Web, dados não estruturados podem ser mensagens, documentos de texto,
apresentações em Power Point, imagens e vídeos. De acordo com Geetha e Mala [12],
dados não estruturados são dados que não possuem um modelo de dados definido e não
oferecem um esquema predefinido de acesso aos dados.
De acordo com Barbulescu et al. [2], email é um exemplo de dado não estrutu-
3.4 Metadados
32
rado. Na caixa de entrada de um mensagem, as informações podem ser organizadas por
data, hora ou tamanho. Se o email fosse totalmente estruturado, seria possível organizar
também por assunto ou conteúdo.
3.4
Metadados
Metadados são considerados "dados sobre dados"[20], [30], ou seja, dados que
descrevem dados. Os metadados descrevem, localizam, explicam um dado, o que torna
possível a recuperação e gerenciamento dos dados [30]. Por exemplo: em um sistema
gerenciador de bancos de dados, se uma pessoa deseja conhecer o domínio, os bancos de
dados criados, as relações em cada banco de dados, deve-se recorrer ao catálogo do banco
de dados, que retornará informações sobre os dados que deseja consultar. McGreal [20]
exemplifica metadados com uma situação do mundo real: uma pessoa precisa encontrar
uma casa em uma cidade, porém, não tem o nome da rua e também o número da casa.
Neste exemplo, o metadado que representa o nome da rua é o atributo logradouro e o
metadado que representa o número da casa é o atributo número. Com base nesses dados,
seria possível encontrar a casa desejada, ou seja, o logradouro e o número do imóvel
descrevem a localização da casa.
Os metadados podem ser classificados em três categorias [30]: (1) metadados
descritivos descrevem recursos com o objetivo de identificar e recuperar informações
através de elementos, tais como: título, autor, palavras-chave; (2) metadados estruturados descrevem como os objetos são compostos e suas relações. Por exemplo: o esquema
do banco de dados [34]; (3) metadados administrativos fornecem informações que auxiliam o gerenciamento de recursos, tais como controle de permissões de acesso, localização
de arquivos [34].
Configuração do banco de dados
Elemento
Valor
Nome do banco de dados Vendas
Nome do usuário
User
Senha
123456
IP do servidor
192.168.1.1
Porta de comunicação
1433
Banco de dados
MSSQL Server
Data da criação
19/11/2011
Tabela 3.5: Exemplo de metadados
A Tabela 3.5 apresenta um exemplo de metadados estruturados, modelo utilizado
neste trabalho. A partir dos dados configurados, é possível identificar que existe uma base
de dados chamada Vendas, que está armazenada no banco de dados Postgresql, e, caso seja
3.5 Arquitetura JDBC
33
necessário se conectar à base de dados, deverá informar o usuário User, a senha 123456 e
a porta de comunicação 1433, ou seja, o conjunto de metadados descreve a maneira para
tornar possível conectar com um banco de dados.
3.5
Arquitetura JDBC
Em uma aplicação que manipula dados originados de várias fontes, a conexão
com os bancos de dados é uma tarefa difícil, pois cada um deles disponibiliza recursos
diferentes para receber as conexões da aplicação, o que torna inviável o estudo de todos
os bancos de dados e a maneira em que é feita a conexão, proporcionando um alto grau
de complexidade no desenvolvimento de aplicações [46]. Nesse contexto, é importante
um mecanismo que ofereça um tipo de conexão padrão com todos os bancos de dados e
assuma as tarefas de realizar as operações.
JDBC (Java Database Connectivity) é uma API desenvolvida na linguagem
Java com o objetivo de executar comandos SQL em bancos de dados [46]. Essa API é
composta de classes, métodos e interfaces Java que são responsáveis por interagir com
a aplicação através de uma linguagem unificada de acesso a dados. Esse conjunto de
elementos é chamado de driver JDBC [44]. Zhang e Zhang [46] argumentam que JDBC
é um mecanismo que estabelece um diálogo entre a aplicação e o banco de dados.
Os drivers JDBC são classificados em quatro categorias, em que cada tipo de
driver contém características e mecanismos diferentes de comunicação com o banco de
dados [46].
Figura 3.12: Tipos de drivers JDBC [46]
A Figura 3.12 apresenta as quatro categorias driver JDBC [46]. Nesse trabalho,
foram utilizados drivers JDBC da quarta categoria.
3.5 Arquitetura JDBC
34
• A primeira categoria consiste de um mecanismo em que são necessários dois
drivers, JDBC e ODBC, para se comunicar com o banco de dados. Nessa categoria,
é necessário instalar bibliotecas locais, o que interfere na portabilidade da aplicação.
• A segunda categoria é composta por parte do programa Java e parte da aplicação
local, e é utilizada para comunicar com o banco de dados cliente. São instalados
drivers específicos nos computadores locais (como driver ODBC), e o driver JDBC
na aplicação transforma as requisições de acesso ao banco de dados no padrão da
API local.
• A terceira categoria é chamada de middleware. Nessa categoria, não é necessário a
instalação de qualquer outro tipo de driver, porém, o driver deve ser instalado no
servidor de banco de dados. O middleware é responsável por realizar as conversões
necessárias para o acesso ao banco de dados.
• A quarta categoria é o driver JDBC Java puro. Nessa categoria, os drivers se comunicam diretamente com o banco de dados, o que proporciona uma independência de
plataforma de desenvolvimento. Assim como na terceira categoria, não é necessário
a instalação de drivers adicionais para a execução de comandos com os bancos de
dados.
Para utilizar a API JDBC em uma aplicação, o desenvolvedor deve, primeiramente, identificar se existe algum driver disponível para o banco de dados utilizado.
Grande parte dos fornecedores de bancos de dados oferecem drivers JDBC a fim de apoiar
a comunicação das aplicações com os bancos de dados. Wiley [44] diz que uma das principais vantagens em utilizar a API JDBC é permitir o acesso a vários bancos de dados,
como MSSQL Server, Oracle, MySQL, sem a necessidade de modificar o código fonte da
aplicação.
A Figura 3.13 apresenta um exemplo em que a API JDBC é utilizada entre a
aplicação e o banco de dados. O núcleo da API JDBC é composto pelo driver JDBC, que
implementa todas as classes e interfaces para conectar e manipular os dados no banco de
dados. Através dos métodos criados no driver JDBC, é construída a conexão para o banco
de dados a ser acessado [44]. A camada driver manager é responsável por gerenciar os
drivers que devem ser utilizados para realizar uma conexão com cada banco de dados
[46].
A API JDBC, quando utilizada pela aplicação, é executada através de três
procedimentos principais [44]: (1) estabelecer a conexão entre a aplicação e o banco de
dados, em que é necessário informar os metadados para realizar a conexão; (2) construir
e executar o comando SQL. Os comandos SQL são construídos na sintaxe padrão SQL,
que é o formato reconhecido pela API; (3) processar os resultados. Após a execução do
comando SQL, a API JDBC recebe o resultado da operação executada pelo banco de
dados no formato de tabela, contendo linhas e colunas.
3.5 Arquitetura JDBC
35
Figura 3.13: Exemplo da arquitetura JDBC [44]
Alguns bancos de dados NOSQL também fornecem driver JDBC [17]. Isso é um
aspecto positivo para resolver parte dos desafios identificados durante a pesquisa, pois, se
tanto os bancos de dados relacionais quanto os bancos de dados NOSQL oferecem driver
JDBC, a aplicação fica responsável por utilizar o driver JDBC do fabricante do banco de
dados.
3.5.1
Driver JDBC para Cassandra
A linguagem de consulta do banco de dados Cassandra, chamada CQL, possui
uma estrutura sintática que se assemelha à linguagem SQL, como foi comentado anteriormente. Entretanto, a semântica implementada na linguagem CQL é diferente da linguagem SQL. Para atender as necessidades do presente trabalho, é importante que a linguagem CQL tenha um comportamento similiar à linguagem SQL, resultando assim em uma
estrutura única de acesso aos dados. O Cassandra fornece uma API JDBC [5], que é uma
extensão da API JDBC padrão, e oferece mecanismos para realizar operações com banco
de dados (conexão com banco de dados, criação de relações, consultas e etc.), utilizando
os recursos que são oferecidos pela arquitetura JDBC, através da sintaxe da linguagem
SQL.
A responsabilidade da API JDBC do Cassandra é realizar o mapeamento para
converter a estrutura da consulta SQL na estrutura da linguagem CQL, fornecer uma
interface unificada de acesso aos dados e permitir enviar uma consulta SQL para o banco
3.5 Arquitetura JDBC
36
de dados Cassandra. As validações de possíveis elementos que podem estar contidos na
consulta SQL, mas que não são reconhecidos pelo Cassandra, é de responsabilidade do
Cassandra. Por exemplo: uma consulta SQL pode conter os elementos left join, top, avg
ou sum. A API JDBC do Cassandra recebe a consulta SQL contendo esses elementos e
envia para o banco de dados. Se não conseguir executar a consulta, será retornado um erro.
Se a consulta for executada com êxito, o resultado é retornado em um objeto Resultset,
componente da API JDBC.
O driver JDBC disponível para o Cassandra recebe atualizações constantes, não
sendo possível afirmar se uma determinada funcionalidade disponível em uma versão
estará disponível em outras versões posteriores. Portanto, as versões do driver JDBC
podem interferir nos resultados obtidos em operações com o banco de dados.
3.5.2
Driver JDBC para MongoDB
O banco de dados MongoDB possui uma estrutura diferente de acesso aos dados
em relação à estrutura da linguagem SQL e da linguagem CQL. Isso se deve ao fato
de possuir uma estrutura diferente da abordagem relacional e da abordagem NOSQL
orientado a colunas. No entanto, é possível encontrar o driver JDBC para o MongoDB
que proporciona um mecanismo de acesso aos dados utilizando a sintaxe SQL [23].
Da mesma maneira como é realizado no banco de dados Cassandra, a responsabilidade do driver JDBC para o MongoDB é mapear a estrutura do comando SQL para
a estrutura do banco de dados MongoDB, possibilitando um mecanismo de acesso unificado aos dados. Ao executar a consulta, o MongoDB tem a responsabilidade de receber
a consulta SQL e validar os atributos e os elementos que foram utilizados na consulta.
Se a consulta for executada com êxito, o resultado é retornado em um objeto Resultset,
que é componente da API JDBC. Se a consulta não for executada com êxito, o banco de
dados retornará uma mensagem informando o motivo pelo qual não foi possível executar
a consulta SQL.
CAPÍTULO 4
Um método para integração de dados
armazenados em bancos de dados relacionais e
NOSQL
Neste capítulo é apresentado um método desenvolvido para integração de dados armazenados em bancos de dados de diferentes abordagens distribuídos em vários
servidores. O método é capaz de executar consultas sem o prévio conhecimento sobre a
localização dos bancos de dados em que estão armazenados os dados.
4.1
Modelo da solução proposta
O presente trabalho define um mecanismo de resolução de consultas inspirado
em [45], em que a partir de uma consulta de entrada escrita nos padrões da linguagem
de consulta SQL, várias outras consultas correspondentes são construídas, sendo uma
para cada relação que compõe a consulta SQL de entrada. Isso se deve ao fato de que as
relações podem estar distribuídas em vários bancos de dados, relacionais e/ou NOSQL.
Sendo assim, as consultas criadas a partir da consulta SQL de entrada são submetidas
separadamente aos respectivos bancos de dados. Os resultados parciais gerados em cada
consulta são armazenados em um único banco de dados relacional temporário, contendo
as relações e atributos de cada consulta. O resultado final é gerado através da submissão
da consulta SQL de entrada no banco de dados relacional temporário.
Ao receber uma consulta SQL, o método não exige o conhecimento prévio dos
bancos de dados nos quais estão armazenados os dados relevantes para o resultado da
consulta de entrada. O método é capaz de identificar os bancos de dados envolvidos na
consulta com base nos elementos da consulta e em metadados previamente cadastrados,
e fornecer meios de executar a operação com os bancos de dados. Além disso, o método
permite executar consultas contendo os seguintes elementos SQL: sum, count, avg, min,
max, group by, order by, having, like, between, in, and, or, join (e suas variações), mesmo
4.2 Estrutura do método
38
se o atributo referenciado em um dos elementos citados estiver armazenado em bancos de
dados NOSQL.
A comunicação com os bancos de dados acessíveis pelo método é realizada por
meio da API JDBC, ou seja, é criado um mecanismo único de acesso aos dados, em
que é utilizado o driver JDBC para acessar os respectivos bancos de dados. Portanto, é
necessário que um banco de dados forneça um driver JDBC para se tornar acessível pelo
método. Em geral, cada banco de dados possui um driver JDBC próprio. A conexão é
estabelecida conforme metadados fornecidos em uma sequência de caracteres de conexão.
Dada uma consulta SQL de entrada, o método pode ser resumido pela sequência
de tarefas abaixo:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
4.2
Identificar a operação.
Identificar as relações.
Identificar os atributos.
Identificar os predicados.
Construir consultas SQL específicas para cada banco de dados.
Identificar os metadados para comunicação com os bancos de dados.
Executar as consultas construídas nos respectivos bancos de dados.
Receber os resultados parciais das consultas executadas nos vários bancos de dados.
Realizar a integração dos dados.
Apresentar o resultado da consulta.
Estrutura do método
O diagrama de fluxo de dados do método proposto é apresentado na Figura
4.1. A consulta SQL inicial, informada no padrão da linguagem de consulta SQL, é
o ponto inicial para o funcionamento do método. A partir da consulta SQL inicial, o
fluxo do método se desenvolve através de quatro fases: Analisar Consulta SQL, Construir
Comandos SQL, Controlar Execução de Consultas SQL e Gerenciar Resultados. Os
depósitos de dados - Elementos SQL, Metadados, Fontes de Dados e Resultados executam tarefas de armazenamento de configurações de conexão, consultas e resultados
parciais e final.
4.2.1
Consulta SQL Inicial
A consulta inicial é o ponto de entrada para a execução do método proposto. A
sintaxe padrão da linguagem de consulta SQL é utilizada para compor uma consulta e
as relações e atributos que podem ser utilizados são descritos no depósito Metadados. A
4.2 Estrutura do método
39
Figura 4.1: Fluxo de dados do método proposto
consulta SQL inicial é construída com base no esquema local, ou seja, nos metadados de
armazenamento configurados.
A Figura 4.2 ilustra um exemplo de consulta SQL de entrada. Caso a consulta
contenha atributos de relações diferentes com nomes iguais, é necessário preceder o nome
do atributo com o nome da relação. Todos os demais componentes da consulta seguem
a sintaxe padrão SQL. É importante notar que nenhuma referência é feita aos bancos de
dados relevantes para a consulta, os quais serão identificados posteriormente através das
relações envolvidas.
Figura 4.2: Exemplo de consulta
4.2.2
Depósitos de dados
Os depósitos de dados são relações criadas em um banco de dados relacional
e são utilizados pelo método para armazenar permanentemente os seguintes dados:
metadados de conexão e metadados de armazenamento. Além disso, são utilizados para
armazenar temporariamente os seguintes dados: a consulta SQL inicial, os elementos SQL
extraídos da consulta SQL inicial, as novas consultas SQL construídas para cada relação
4.2 Estrutura do método
40
da consulta SQL inicial, os resultados parciais obtidos da execução das novas consultas
SQL construídas.
Elementos SQL
No processo de identificação de elementos SQL a partir da consulta inicial, cada
elemento identificado é armazenado temporariamente para ser consumido pelo processo
de construção de comandos SQL. Os elementos da consulta SQL inicial armazenados
neste depósito de dados são: o tipo da operação, a lista de relações referenciadas, a lista
de atributos de cada relação e os predicados específicos de cada relação (um predicado
específico inclui atributos de uma única relação). As consultas construídas para cada
relação da consulta inicial também são armazenadas temporariamente neste depósito,
juntamente com o nome do banco de dados onde cada consulta será executada.
A Figura 4.3 apresenta o diagrama de classe que representa parte das relações
que compoe o depósito Elementos SQL, bem como a estrutura das relações. O diagrama
mostra que uma relação pode conter vários atributos, e que uma relação pode conter vários
predicados (opcionalmente). As relações apresentadas no diagrama de classe são:
Figura 4.3: Relações do depósito Elementos SQL
• Relacoes: mantém temporariamente as relações identificadas na consulta inicial.
• Atributos: mantém temporariamente os atributos de cada relação juntamente com
o nome da relação.
• Predicados: mantém temporariamente o predicado, o operador utilizado para especificar o próximo predicado (and, or, in) e o nome da relação que mantém o atributo
referenciado no predicado.
4.2 Estrutura do método
41
A Figura 4.4 representa outras duas classes que compoe o depósito Elementos
SQL. As relações não possuem relacionamento entre si, pois mantém temporariamente, na
relação Operacao, a palavra que indica a operação realizada e, na relação ComandosSQL,
os novos comandos SQL construídos para cada relação da consulta inicial, juntamente
com o nome da relação.
Os dados armazenados temporariamente nas relações deste depósito de dados
são excluídos após serem executadas todas as fases do método.
Figura 4.4: Outras relações do depósito Elementos SQL
Metadados
O depósito Metadados é implementado em um banco de dados relacional local,
isto é, diretamente acessível pelo método, composto por um conjunto de relações em que
são mantidas informações necessárias para conexão com os bancos de dados acessíveis
pelo método, bem como suas respectivas estruturas de armazenamento (relações e atributos).
A Figura 4.5 apresenta o diagrama de classe que representa as relações que
compõe os metadados de conexão dos bancos de dados utilizados pelo método. O
diagrama mostra que um banco de dados está associado a um único domínio e um domínio
pode conter vários bancos de dados. Um banco de dados pode conter várias relações e uma
relação pode conter vários atributos. A classe Dominio representa o domínio (assunto dos
dados) que são acessíveis pelo método.
Os metadados de conexão devem ser configurados manualmente e são representados pela classe BancosDeDados e incluem, para cada banco de dados:
• Nome do banco de dados, representado pelo atributo NomeBD.
• Categoria (relacional ou NOSQL), representado pelo atributo Categoria.
• O domínio dos dados armazenados, representado pelo atributo IdDominio, que faz
referência ao atributo IdDominio da relação Dominio.
• O nome ou endereço IP do servidor que hospeda o banco de dados, representado
pelo atributo Servidor.
• A porta de comunicação, representado pelo atributo Porta.
• Uma identificação do driver JDBC, representado pelo atributo DriverJDBC.
• Nome de usuário de acesso ao banco de dados, representado pelo atributo Usuario.
4.2 Estrutura do método
42
Figura 4.5: Representação das relações que compõe os metadados
• Senha do usuário, representado pelo atributo Senha.
Os metadados de armazenamento devem ser configurados manualmente e são
representados, na Figura 4.5, pelas relações Relacoes e Atributos, e incluem, para cada
relação:
Relação Relacoes:
• Nome da relação, representado pelo atributo NomeRelacao.
• Nome do banco de dados ao qual pertence, representado pelo atributo IdBanco,
que faz referência ao atributo IdBanco na relação BancosDeDados.
Relação Atributos:
• Conjunto de atributos, representado pelo atributo NomeAtributo.
• Nome da relação a qual pertence, representado pelo atributo IdRelacao, que faz
referência ao atributo IdRelacao na relação Relacoes.
O mecanismo proposto estabelece uma restrição com respeito aos nomes de
relações. Por esta restrição, bancos de dados no mesmo domínio não podem ter relações
com nomes iguais. Para a definição desta regra, os seguintes argumentos são considerados:
informações de um mesmo domínio podem estar armazenadas em diferentes bancos de
4.2 Estrutura do método
43
dados de diferentes categorias; a consulta SQL inicial não faz referência direta aos bancos
de dados, mas utiliza os nomes de relações para identificar os bancos de dados relevantes
para uma consulta.
Para viabilizar uma consulta a bancos de dados de diferentes categorias, no
contexto do mecanismo proposto neste trabalho, a estrutura de um banco de dados
NOSQL deve ser descrita na forma de relações e atributos.
• Mapeamento de um banco de dados orientado a colunas para relacional
O mapeamento de um banco de dados orientado a colunas para relacional deve
ser feito manualmente, no qual o keyspace é representado pelo nome do banco de
dados, uma família de colunas é representada pelo nome da relação, a chave da
coluna é representada por um atributo [1]. A Figura 4.6 exemplifica a estrutura
de um banco de dados orientado a colunas mapeado para a estrutura relacional.
O exemplo ilustra um keyspace denominado Estoque, contendo uma família de
colunas chamada Clientes, em que cada coluna da família de colunas corresponde
a um atributo de cliente e sua representação relacional.
Figura 4.6: Estrutura de um banco de dados orientado a colunas
mapeada para o modelo relacional
• Mapeamento de um banco de dados orientado a documentos para relacional
De modo análogo, o mapeamento de um banco de dados orientado a documentos
para uma estrutura relacional é feito de forma manual e deve ter a seguinte
correspondência: o banco de dados receberá o nome do banco de dados criado para
armazenar a coleção de documentos, uma coleção de documentos é representada
pelo nome da relação, um documento é representado por uma tupla, um atributo
contido no documento é represento por um atributo da relação.
A Figura 4.7 exemplifica o mapeamento da estrutura de um banco de dados
orientado a documentos para a estrutura relacional. A esquerda ilustra uma coleção
de documentos chamada Clientes, na qual cada documento corresponde ao registro
de um cliente, e à direita, a estrutura relacional correspondente.
4.2 Estrutura do método
44
Figura 4.7: Estrutura de um banco de dados orientado a documentos mapeada para o modelo relacional
Fontes de Dados
O depósito Fontes de Dados representa o conjunto de bancos de dados que podem
ser consultados pelo método. Para descrever cada fonte de dados acessível pelo método,
é necessário a configuração de metadados correspondentes, que incluem informações de
conexão e descrição do armazenamento.
Para os metadados de conexão, são mantidas informações que possibilitam
conectar aos bancos de dados, tais como: nome do banco de dados, usuário, senha, porta
de comunicação e uma indicação do driver JDBC do banco de dados. Para os metadados
que descrevem armazenamento, são mantidas informações, tais como: nome de cada
relação, nome dos atributos que compõem as relações e o banco de dados ao qual pertence.
Tais informações são empregadas para gerar e executar consultas nas fontes de dados
consideradas.
Resultados
O depósito Resultados armazena os resultados gerados por cada banco de dados
envolvido na consulta. Para cada relação da consulta, é criada uma relação temporária no
banco de dados local com o mesmo nome e os mesmos atributos da relação da consulta
SQL inicial. A integração dos dados e o retorno do resultado final da consulta são gerados
a partir deste depósito de dados.
Assim como no depósito Elementos SQL, os dados armazenados e as relações
criadas temporariamente neste depósito de dados são excluídos após serem executadas
todas as fases do método.
4.2.3
Analisar Consulta SQL
A função Analisar Consulta SQL corresponde ao procedimento de segmentação
da consulta SQL inicial, para identificar, separadamente, os componentes das cláusulas
4.2 Estrutura do método
45
select, from e where. Cada elemento identificado é armazenado no depósito Elementos
SQL. As tarefas identificar operação, identificar as relações, identificar os atributos e
identificar os predicados, citadas no inicio desta seção, são executadas por esta função.
Ao final do processo de analise da consulta SQL inicial, são armazenados no
depósito Elementos SQL: o tipo da operação, as relações da consulta, e, para cada
relação, sua lista de atributos e seus predicados específicos. Cada par <relação,atributo>
identificado, é validado junto ao depósito Metadados.
A consulta SQL de entrada pode conter elementos na cláusula select e/ou na
cláusula where que não podem ser executados pelos gerenciadores de bancos de dados
NOSQL, tais como: sum, min, max, avg, count, group by, having, between. Assim, a
primeira tarefa executada na fase de análise da consulta SQL inicial consiste em eliminar
os elementos citados, caso existam. Nesta fase, os elementos citados são eliminados
da consulta inicial sem verificar o tipo de banco de dados que está sendo consultado
(relacional ou NOSQL). Os atributos de relacionamentos de cada relação também são
identificados e removidos da consulta SQL inicial.
Figura 4.8: Exemplo de consulta SQL de entrada redefinida
A Figura 4.8 apresenta a mesma consulta exibida na Figura 4.2, porém, a partir da
primeira tarefa na fase de análise da consulta SQL inicial, foram eliminados os atributos
que indicam relacionamentos, pois esses atributos e o relacionamento pode não existir
no banco de dados em que a consulta for executada. Após essa tarefa, o analisador Zql é
utilizado para: identificar a operação realizada, as relações referenciadas, os atributos de
cada relação e os predicados específicos de cada relação.
• Operação: a palavra indicativa da operação realizada é identificada e armazenada
no depósito Elementos SQL.
• Relações: as relações são extraídas e armazenadas no depósito Elementos SQL
• Atributos: os atributos são extraídos em conjunto à relação a qual pertence. Por
exemplo: se o nome do atributo é precedido do nome da relação, é identificado o
par relação e atributo. Caso contrário, é necessária uma consulta no depósito Metadados para identificar a relação que contém o atributo. Cada par <atributo,relação>
identificado é armazenado no depósito Elementos SQL
• Predicados: os predicados são identificados juntamente com a relação que mantém
o atributo referenciado no predicado. Por exemplo: se o atributo é precedido do
4.2 Estrutura do método
46
nome da relação, é identificado o predicado e a relação. Caso contrário, é feita uma
consulta no depósito Metadados para identificar a relação que contém o atributo.
Cada par <predicado,relação> identificado é armazenado no depósito Elementos
SQL
Figura 4.9: Elementos SQL após a análise da consulta SQL
A Figura 4.9 exemplifica o conjunto de elementos SQL identificados e mantidos
temporariamente no depósito Elementos SQL. Os elementos identificados são os mesmos
exemplificados na Figura 4.8.
O algoritmo 1 apresenta os passos que são executados para segmentar a consulta
SQL inicial e identificar cada elemento SQL separadamente.
4.2.4
Construir Comandos SQL
Esta etapa é responsável por construir consultas SQL, uma consulta para cada
relação identificada na consulta SQL inicial. Para tanto, utiliza os elementos da consulta
inicial armazenados no depósito Elementos SQL.
Na consulta SQL de entrada, é necessário informar os atributos de relacionamentos, no caso, rel1.id = rel2.id, pois quando a consulta for executada nos respectivos
bancos de dados e os resultados armazenados temporariamente no depósito Resultados, a
consulta SQL inicial, que contém estes atributos, será executada nesse depósito de dados.
Portanto, o atributo id de ambas as relações deve estar presente nas relações temporárias
do depósito Resultados.
O algoritmo 2 apresenta os passos que são executados para construir consultas
SQL para cada relação envolvida na consulta inicial.
4.2 Estrutura do método
47
Algoritmo 1: Analisar a consulta SQL inicial
Entrada: Consulta SQL inicial
Saída: Operação, relações, atributos e predicados da consulta inicial
inicio
Elimina Elementos
Elimina Predicados
Identifica Operação
Identifica Relações
Identifica Atributo
se Atributo Indica Agregação então
Identifica Atributo
se Precede Relação então
Grava Par Atributo-Relação
fim
senão
Identifica Relação do Atributo
Grava Par Atributo-Relação
fim
fim
senão
se Precede Relação então
Grava Par Atributo-Relação
fim
senão
Identifica Relação do Atributo
Grava Par Atributo-Relação
fim
fim
se Existe Predicado então
se Relacao Precede Atributo então
Grava Predicado
fim
senão
Identifica Relação do Atributo
Grava Predicado
fim
fim
fin
As consultas SQL construídas nesta fase são armazenadas no depósito Elementos
SQL, cada uma com uma referência ao banco de dados objeto da consulta. A Figura
4.10 exemplifica as consultas SQL construídas pelo método a partir da consulta inicial
exemplificada na Figura 4.8. Neste exemplo, o banco de dados BD1 é ilustrado em um
banco de dados relacional e o banco de dados BD2 é ilustrado em um banco de dados
NOSQL.
4.2 Estrutura do método
48
Figura 4.10: Consultas construídas pelo método.
Algoritmo 2: Construir consultas SQL
Entrada: Elementos SQL extraídos da consulta inicial
Saída: Consultas SQL para cada relação da consulta inicial
inicio
Busca Relações no Depósito Elementos SQL
enquanto Existe Relação faça
Identifica Atributos da Relação Atual
Identifica Predicados da Relação Atual
Identifica Bd da Relação Atual
Constrói Consulta SQL
Grava Consulta SQL no Depósito Elementos SQL
fim
fin
4.2.5
Controlar Execução de Consultas SQL
O processo Controlar Execução de Consultas SQL realiza toda a tarefa de envio
das consultas para os bancos de dados referenciados na consulta SQL inicial. Para cada
consulta, são executadas as seguintes tarefas:
1.
2.
3.
4.
5.
6.
Criar relações temporárias no depósito Resultados.
Buscar metadados de conexão com o banco de dados no depósito Metadados.
Estabelecer a conexão com o banco de dados.
Enviar a consulta para execução.
Receber o resultado da consulta.
Armazenar o resultado em uma relação temporária no depósito Resultados.
Para cada consulta são criadas relações temporárias no depósito Resultados a
fim de receber os resultados obtidos em cada consulta executada. As relações são criadas
contendo os atributos de cada relação informados na consulta SQL inicial.
4.2 Estrutura do método
49
As tarefas Estabelecer a conexão com o banco de dados, Enviar a consulta para
execução e Receber o resultado da consulta são realizadas com o apoio do driver JDBC
de cada banco de dados. Para os bancos de dados NOSQL, o próprio driver JDBC tem a
tarefa de traduzir a consulta SQL para o padrão de cada banco de dados NOSQL.
O algoritmo 3 apresenta os passos que são executados para executar as consultas
construídas para cada relação envolvida na consulta inicial e armazenar os resultados
parciais no depósito Resultados.
Algoritmo 3: Executar consultas SQL construídas
Entrada: Comandos SQL construídos para cada relação da consulta inicial
Saída: Resultados parciais obtidos em cada banco de dados
inicio
Busca Relações no Depósito Elementos SQL
enquanto Existir Relação faça
Busca Comando SQL Construído
Busca Metadados da Relação
Busca Metadados de Conexão do Banco de Dados
se Categoria = Coluna então
Executa Consulta Banco de Dados Coluna
Grava Resultado Parcial da Consulta no Depósito Resultados
fim
se Categoria = Documento então
Executa Consulta Banco de Dados Documento
Grava Resultado Parcial da Consulta no Depósito Resultados
fim
se Categoria = Relacional então
Executa Consulta Banco de Dados Relacional
Grava Resultado Parcial da Consulta no Depósito Resultados
fim
fim
fin
4.2.6
Gerenciar Resultados
Este processo executa a consulta SQL de entrada no depósito Resultados utilizando os resultados parciais armazenados. Este processo é exemplificado na Figura 4.11.
A solução adotada permite executar a consulta SQL inicial em um banco de
dados relacional, mesmo que os resultados parciais tenham sido obtidos de bancos de
dados NOSQL. Assim, com os resultados parciais mantidos em um banco de dados
relacional, é possível utilizar todos os recursos que a linguagem SQL oferece, tais como
4.2 Estrutura do método
50
junções, agregações, ordenações e outros recursos não disponíveis em bancos de dados
NOSQL.
Figura 4.11: Consulta inicial executada no depósito Resultados
4.2.7
Exemplo passo a passo
Dada uma consulta inicial: select IdVenda, DataVenda, Vendas.IdCliente,
Cliente.IdCliente, TotalVenda, Nome, Endereco from Vendas, Cliente where Vendas.IdCliente = Cliente.IdCliente and DataVenda = 22/05/2013 and Nome = Pedro, em
que a relação Vendas está armazenada em um banco de dados NOSQL orientado a colunas e a relação Cliente está armazenada em um banco de dados relacional, os passos que
são executados para obter o resultado final são:
• Passo 1:
Objetivo: eliminar os elementos que não são reconhecidos pelo analisador Zql e
atributos de relacionamentos.
Resultado: select IdVenda, DataVenda, Vendas.IdCliente, Cliente.IdCliente, TotalVenda, Nome, Endereco from Vendas, Cliente where DataVenda = 22/05/2013 and
Nome = Pedro.
• Passo 2:
Objetivo: identificar a operação, relações, atributos e predicados da consulta inicial
e armazenar temporariamente no depósito Elementos SQL.
Resultado: elementos SQL identificados separadamente. O resultado do passo 2 é
ilustrado nas tabelas 4.1 e 4.2.
Relação
Atributos
Predicado
Vendas
IdVenda, IdCliente, DataVenda, TotalVenda
DataVenda = 22/05/2013
Tabela 4.1: Relações, atributos e predicados da relação Vendas.
• Passo 3:
Objetivo: construir novas consultas SQL, sendo uma para cada relação envolvida na
4.2 Estrutura do método
Relação
Atributos
Predicado
51
Cliente
IdCliente, Nome e Endereco
Nome = Pedro
Tabela 4.2: Relações, atributos e predicados da relação Cliente.
consulta inicial, compostas pelos atributos e predicados específicos de cada relação.
Resultado: consultas construídas para cada relação envolvida na consulta inicial. O
resultado do passo 3 é ilustrado na Tabela 4.3.
Consulta 1
Consulta 2
select IdVenda, IdCliente, DataVenda, TotalVenda from Vendas
where DataVenda = 22/05/2013
select IdCliente, Nome, Endereco from Cliente where Nome =
Pedro
Tabela 4.3: Consultas SQL construídas para cada relação.
• Passo 4:
Objetivo: executar cada consulta nos respectivos bancos de dados separadamente,
criar relações temporárias no depósito Resultados e armazenar os resultados parciais temporariamente.
Resultado: relações Cliente e Vendas criadas temporariamente no depósito Resultados. O resultado é ilustrado nas tabelas 4.4 e 4.5.
Relação Cliente
IdCliente Nome
2
Pedro
Endereco
Rua 12, n54
Tabela 4.4: Relação Cliente criada no depósito Resultados.
Relação Vendas
IdVenda
IdCliente
DataVenda
TotalVenda
1
2
22/05/2013
150.00
25
2
22/05/2013
95.00
33
2
22/05/2013
50.00
Tabela 4.5: Relação Vendas criada no depósito Resultados.
• Passo 5:
Objetivo: executar a consulta inicial no depósito Resultados.
Resultado: dados solicitados na consulta inicial retornados do depósito Resultados.
O resultado do passo 5 é ilustrado na Tabela 4.6.
4.2 Estrutura do método
52
Resultado da consulta inicial
IdVenda
DataVenda
IdCliente IdCliente TotalVenda Nome
Endereco
1
22/05/2013
2
2
150.00
Pedro
Rua 12, n54
25
22/05/2013
2
2
95.00
Pedro
Rua 12, n54
33
22/05/2013
2
2
50.00
Pedro
Rua 12, n54
Tabela 4.6: Resultado da consulta inicial executada no depósito
Resultados.
• Passo 6:
Objetivo: eliminar todas as relações temporarias criadas no passo 4 e todos os elementos SQL identificados no passo 2.
Resultado: relações criadas no passo 4 excluídas do depósito Resultados. Elementos SQL identificados no passo 2 eliminados do depósito Elementos SQL.
Os passos apresentados anteriormente aplicam todos os processos descritos do
método proposto. É importante destacar que, na consulta SQL inicial, alguns atributos foram solicitados precedendo o nome da relação, pois existem, na mesma consulta, atributos
com o mesmo nome. Portanto, é necessário informar qual relação mantém o respectivo
atributo. Entretanto, outros atributos não foram precedidos pelo nome da relação. Neste
caso, o método é capaz de identificar através dos metadados de armazenamento a relação
que mantém um determinado atributo.
A partir da apresentação do método proposto, é possível definir como principal
contribuição deste trabalho, acessar vários bancos de dados através de uma única consulta
escrita na linguagem de consulta SQL, mesmo em bancos de dados NOSQL, que,
nativamente, não suporta tal linguagem de consulta. Além disso, é possível executar
consultas contendo os seguintes elementos: sum, count, min, max, avg, group by, having,
order by, join, between, like, in, or, and, mesmo que as relações e atributos estejam
armazenados em bancos de dados NOSQL.
CAPÍTULO 5
Um protótipo para avaliar o método de
integração de dados
Para demonstrar a viabilidade do método proposto neste trabalho, um protótipo
foi desenvolvido. Nesta seção estão descritas sua estrutura, seus requisitos funcionais e
não funcionais, os desafios encontrados durante o seu desenvolvimento, as configurações
realizadas para permitir o funcionamento do protótipo e os resultados obtidos com a
execução do protótipo.
Diante do contexto apresentado no Capítulo 1, dos trabalhos relacionados ao
assunto de integração de dados no Capítulo 2 e do método apresentado no Capítulo 4, os
objetivos do protótipo são:
• Permitir a experimentação do método proposto através de consultas escritas no
padrão da linguagem de consulta SQL, contendo elementos que não são executados
de forma nativa pelos bancos de dados NOSQL, tais como: sum, count, min, max,
avg, join, group by, order by, having, like, or, in, and.
5.1
Desafios encontrados durante o desenvolvimento
Durante o desenvolvimento do protótipo, alguns desafios foram superados, entre
eles, estão:
• Cada categoria de bancos de dados NOSQL oferece recursos diferentes na manipulação de dados, além de serem diferentes da abordagem relacional, motivos pelos
quais tornou difícil encontrar um mecanismo padrão de acesso aos dados.
• Encontrar um ambiente real que utiliza as duas abordagens de bancos de dados para
aplicar o método proposto.
• Encontrar um driver JDBC para cada banco de dados NOSQL.
5.2 Requisitos do protótipo
5.2
54
Requisitos do protótipo
Os requisitos funcionais são as especificações do que o sistema deve fornecer, de
como o sistema deve reagir à entradas específicas [36]. Por exemplo: cadastro de produtos,
cadastro de clientes, registro de vendas e etc.
O protótipo deve fornecer meios de inserir uma consulta no padrão da linguagem
SQL e um mecanismo de visualização do resultado final da consulta. Após o término da
consulta, o protótipo deve estar preparado para uma nova consulta. Além disso, deve
permitir as configurações de metadados necessários para executar uma consulta, tais
como: metadados de conexão dos bancos de dados acessíveis ao protótipo, domínios,
relações, atributos e predicados. A tabela 5.1 apresenta os requisitos funcionais do
protótipo.
Requisito
RF1
RF2
RF3
RF4
RF5
RF6
RF7
Descrição
Os metadados de conexão dos bancos de dados disponíveis devem
ser configurados.
Devem ser configurados os metadados de armazenamento, tais
como: relações, atributos, predicados e domínios.
Deve haver meios de se inserir uma consulta no padrão da linguagem SQL.
O protótipo deve acessar os bancos de dados envolvidos na consulta SQL inicial, e, para isso, utilizar os metadados de conexão
previamente configurados.
O protótipo deve construir novas consultas SQL, uma para cada
relação identificada na consulta SQL inicial.
As novas consultas devem ser executadas em seus respectivos
bancos de dados.
Os resultados parciais gerados em cada banco de dados devem ser
integrados em apenas um resultado final.
Tabela 5.1: Tabela de requisitos funcionais do protótipo
Requisitos não funcionais são restrições aos serviços ou funções oferecidos pelo
sistema [36]. Por exemplo: se um sistema funciona em rede ou não, quais bancos de
dados utilizados, tempo máximo de consulta e etc. A tabela 5.2 apresenta os requisitos
não funcionais do protótipo.
Requisito
RNF1
Descrição
O protótipo deve ser capaz de executar consultas em bancos de
dados relacionais e NOSQL
Tabela 5.2: Tabela de requisitos não funcionais do protótipo
5.3 Descrição do protótipo
5.3
55
Descrição do protótipo
Nesta seção são descritas as tecnologias utilizadas no desenvolvimento do protótipo e as telas disponíveis para realizar as configurações no protótipo.
5.3.1
Tecnologias utilizadas
Para o desenvolvimento do protótipo foram utilizadas as seguintes ferramentas:
Java 7.13 como linguagem de programação, NetBeans 8.0.1 como IDE de desenvolvimento, sistema operacional Windows 7 Ultimate, banco de dados MSSQL Server Express,
Astah Professional para criação dos diagramas.
5.3.2
Funcionalidades do protótipo
O protótipo foi desenvolvido com características desktop, isto é, deve ser instalado em computadores distribuídos em uma rede, não sendo necessário a utilização de
browsers para sua execução. A Figura 5.1 apresenta a tela inicial do protótipo.
Figura 5.1: Tela inicial do protótipo
No estágio de desenvolvimento atual, o protótipo fornece as seguintes funcionalidades para cadastramento de metadados.
• Cadastrar BD: opção disponível para configurar os bancos de dados acessíveis no
protótipo, bem como seus metadados de conexão.
• Cadastrar Relações: opção disponível para configurar as relações que compõe um
bancos de dados.
• Cadastrar Atributos: opção disponível para configurar os atributos de cada relação.
5.3 Descrição do protótipo
56
• Cadastrar Domínios: opção disponível para cadastrar os domínios da aplicação.
A Figura 5.2 apresenta a tela de cadastro dos metadados de conexão de bancos
de dados.
Figura 5.2: Tela de cadastro metadados de conexão
As opções disponíveis são:
• Servidor: nome ou endereço IP do servidor no qual está instalado o banco de dados.
A porta de comunicação com o banco de dados deve ser informada posteriormente
precedida do sinal de dois pontos (:).
• Domínio: nome do domínio em que o banco de dados está contido.
• Driver JDBC: representação do driver JDBC do banco de dados.
• Classe BD: representação da classe do driver JDBC do banco de dados.
• Nome do banco de dados: nome do banco de dados.
• Usuário: usuário de acesso ao banco de dados.
• Senha: senha de acesso ao banco de dados.
• Categoria: nome indicativo da categoria do banco de dados (Coluna, para bancos
de dados orientado a colunas, Documento, para bancos de dados orientado a
documentos, e Relacional, para bancos de dados relacionais).
• SGBD: nome do SGBD.
A Figura 5.3 apresenta a tela de cadastro de relações.
As opções disponíveis são:
• Relação: nome da relação.
5.3 Descrição do protótipo
57
Figura 5.3: Tela de cadastro de relações
Figura 5.4: Tela de cadastro de atributos
• Nome do banco de dados: nome do banco de dados na qual a relação está contida.
A Figura 5.4 apresenta a tela de cadastro de atributos.
As opções disponíveis são:
• Atributo: nome do atributo.
• Relação: nome da relação no qual o atributo está contido.
A Figura 5.5 apresenta a tela de cadastro de domínios.
A opção disponível é:
• Domínio: indica o nome do domínio que o protótipo será executado.
5.4 Resultados obtidos
58
Figura 5.5: Tela de cadastro de domínios
Em todas as telas do protótipo são disponibilizados alguns componentes em
comum:
• Uma tabela na qual estão contidos todos os cadastrados.
• Botão Novo, que permite limpar os componentes de texto, gerar um novo Id para o
cadastro e iniciar um novo registro.
• Botão Salvar, que permite salvar os dados informados.
• Botão Alterar, que permite alterar um registro cadastrado.
• Botão Excluir, que permite excluir um registro.
• Campo Id, que tem a tarefa de manter a integridade dos dados, contendo um valor
único para cada registro, sendo gerado automaticamente pelo protótipo.
5.4
Resultados obtidos
Devido à dificuldade de encontrar um banco de dados público com as características desejadas para esse trabalho, ou seja, com dados distribuídos em bancos de dados
relacionais e NOSQL, foi necessário criar alguns bancos de dados de exemplo para aplicar o método proposto. Os bancos de dados apresentados nesta seção são considerados de
pequeno porte e utilizados apenas para o experimento, motivo pelo qual, aspectos como
escalabilidade, desempenho e tempo de consulta não foram considerados nos experimentos. Por este motivo, o objetivo dos experimentos é validar o método proposto executando
consultas escritas no padrão da linguagem de consulta SQL em bancos de dados relacionais e NOSQL, contendo elementos não executados de forma nativa pelos bancos de
dados NOSQL.
Como explicado no Capítulo 3, bancos de dados NOSQL não permitem relacionamentos. Entretanto, para ilustrar o domínio e as famílias de colunas, coleções de
5.4 Resultados obtidos
59
documentos e relações criadas para executar os experimentos, foram criados diagramas
de classe, e em alguns diagramas, contendo a indicação de relacionamentos, porém, esses
relacionamentos são realizados na aplicação.
5.4.1
Ambiente dos experimentos
O protótipo implementado é composto por elementos que precisam ser configurados para alcançar os objetivos propostos pelo método. A seguir são apresentadas as
configurações dos metadados de conexão dos bancos de dados acessíveis pelo protótipo,
bem como os metadados de armazenamento de cada relação.
Nome BD
BDVendas
Categoria
Coluna
Domínio
Varejista
Servidor
localhost
Porta
9160
CondPag
Documento
Varejista
localhost
27017
BDDados
Relacional
Varejista
FLAVIOFAV
1433
Documento
Varejista
localhost
27017
Relacional
Varejista
localhost
5432
Documento
Varejista
localhost
27017
Clientes
BDFuncionarios
Fornecedor
JDBC
jdbc:
cassandra
jdbc:
mongo
jdbc:
sqlserver
jdbc:
mongo
jdbc:
postgresql
jdbc:
mongo
Usuario Senha
FAV
123
postgres fav123
Tabela 5.3: Configuração dos metadados de conexão no depósito
Metadados
A Tabela 5.3 apresenta a configuração dos metadados de conexão dos bancos de
dados acessíveis pelo protótipo.
O domínio criado para aplicar o método proposto corresponde a uma empresa
fictícia de vendas e mantém informações sobre vendas efetuadas, tais como: número da
venda, data da venda, nome do cliente, produtos vendidos e outros dados referentes às
vendas. As consultas podem solicitar, por exemplo, informações sobre as vendas efetuadas
em um período de tempo, a média das vendas entre um mês e outro, as compras efetuadas
por um determinado cliente, além de outros tipos de consultas.
A Tabela 5.4 apresenta as relações, coleções de documentos e famílias de colunas
criadas em bancos de dados relacionais e em bancos de dados NOSQL a fim de realizar os
experimentos. Foi criado um keyspace no banco de dados Cassandra chamado BDVendas,
e nele foram criadas duas famílias de colunas, Vendas e ItensVenda. Foram criados
três bancos de dados no banco de dados MongoDB: Fornecedor, e criada também uma
5.4 Resultados obtidos
SGBD
Cassandra
MongoDB
MongoDB
MongoDB
MSSQL Server
Postgresql
Categoria
Coluna
Documento
Documento
Documento
Relacional
Relacional
60
Nome Banco
BDVendas
Fornecedor
Clientes
CondPag
BDDados
BDFuncionarios
Repositórios
Vendas, ItensVenda
Fornecedor
Clientes
CondPag
Produto, EntradaNFe, ItensEntrada
Funcionarios
Tabela 5.4: Conjunto de relações, coleções de documentos e famílias de colunas para os experimentos.
coleção de documentos chamada Fornecedor; Clientes, e criada também uma coleção de
documentos chamada Clientes; CondPag, e criada também uma coleção de documentos
chamada CondPag. No banco de dados MSSQL Server foi criado um banco de dados
chamado BDDados com as seguintes relações: Produto, EntradaNFe e ItensEntrada. No
banco de dados Postgresql foi criado um banco de dados chamado BDFuncionarios com
a relação Funcionarios.
A Figura 5.6 apresenta o diagrama de classe que representa as famílias de colunas
criadas no banco de dados Cassandra. O diagrama apresenta uma relação de composição
entre as relações Vendas e ItensVenda, na qual só haverá itens de venda se existir uma
venda relacionada aos itens, e uma venda pode conter vários itens de venda.
Figura 5.6: Famílias de colunas criadas no banco de dados Cassandra.
Os objetivos da família de colunas Vendas são armazenar informações sobre as
vendas, tais como:
• Número da venda, representado pelo atributo IdVenda.
• O cliente que efetuou a compra, representado pelo atributo IdCliente.
• A condição de pagamento utilizada para faturar a venda, representado pelo atributo
IdCondPag.
• O vendedor que efetivou a venda, representado pelo atributo IdFuncionario.
• A data em que a venda foi efetuada, representada pelo atributo DataVenda.
A família de colunas ItensVenda é responsável por armazenar os itens (produtos)
que são gerados para cada venda e outras informações, tais como:
5.4 Resultados obtidos
61
•
•
•
•
Número da venda, representado pelo atributo IdVenda.
O produto vendido, representado pelo atributo IdProduto.
O preço de venda do produto, representado pelo atributo PrecoUnitario.
A quantidade vendida de um determinado produto, representada pelo atributo
Quantidade.
• O valor total do produto, que é o preço de venda multiplicado pela quantidade,
representado pelo atributo SubTotal.
Figura 5.7: Coleção de documentos Clientes criada no banco de
dados MongoDB.
A Figura 5.7 apresenta o diagrama de classe criado para representar a coleção
de documentos criada no banco de dados MongoDB chamada Clientes. A coleção de
documentos Clientes é responsável por armazenar dados referentes aos clientes, tais
como:
•
•
•
•
•
O número que identifica o cliente, representado pelo atributo IdClienteC.
O nome do cliente, representado pelo atributo Nome.
O endereço do cliente, representado pelo atributo Endereco.
A cidade do cliente, representado pelo atributo Cidade.
O telefone do cliente, representado pelo atributo Telefone.
Figura 5.8: Coleção de documentos Fornecedor criada no banco
de dados MongoDB.
A Figura 5.8 apresenta o diagrama de classe criado para representar a coleção
de documentos criada no banco de dados MongoDB chamado Fornecedor. A coleção de
5.4 Resultados obtidos
62
documentos Fornecedor é responsável por armazenar dados referentes aos fornecedores,
tais como:
•
•
•
•
•
O número que identifica o fornecedor, representado pelo atributo IdFornecedor.
O nome do fornecedor, representado pelo atributo RazaoSocial.
O CNPJ do fornecedor, representado pelo atributo Cnpj.
O endereço do fornecedor, representado pelo atributo Endereco.
A cidade do fornecedor, representada pelo atributo Cidade.
Figura 5.9: Coleção de documentos CondPag criada no banco de
dados MongoDB.
A Figura 5.9 apresenta o diagrama de classe criado para representar a coleção
de documentos criada no banco de dados MongoDB chamada CondPag. A coleção de
documentos CondPag é responsável por armazenar dados referentes às condições de
pagamento disponíveis, tais como:
• O número que identifica a condição de pagamento, representado pelo atributo
IdCondPag.
• A descrição da condição de pagamento, representada pelo atributo DescricaoCP.
A Figura 5.10 apresenta o diagrama de classe criado para representar as relações
criadas no banco de dados MSSQL Server. O diagrama apresenta um relacionamento
de composição entre as relações EntradaNFe e ItensEntrada, em que só haverá itens
de entrada se houver uma entrada relacionada aos itens, e uma relação de agregação
entre as relações ItensEntrada e Produto, em que cada item da entrada tem um produto
relacionado, e poderá haver produtos cadastrados mesmo se não houver entradas.
A relação EntradaNFe é responsável por armazenar as informações principais
das entradas de notas fiscais, tais como:
• Número de identificação da entrada, representado pelo atributo IdEntrada.
• O fornecedor no qual os produtos foram comprados, representado pelo atributo
IdFornecedor.
• O funcionário que efetuou a compra, representado pelo atributo IdFuncionario.
• A data em que foi dada a entrada da nota fiscal, representada pelo atributo DataEntrada.
5.4 Resultados obtidos
63
Figura 5.10: Relações criadas no banco de dados MSSQL Server.
• O valor total da nota fiscal, representado pelo atributo ValorTotal.
A relação ItensEntrada é responsável por armazenar as informações dos itens
(produtos) das entradas de notas fiscais, tais como:
•
•
•
•
•
Número de identificação da entrada, representado pelo atributo IdEntrada.
O produto comprado, representado pelo atributo IdProduto.
O valor de compra do produto, representado pelo atributo ValorCompra.
A quantidade comprada, representada pelo atributo Quantidade.
O valor total do produto, que é o preço de compra multiplicado pela quantidade,
representado pelo atributo SubTotal.
A relação Produto é responsável por armazenar as informações dos produtos
disponíveis para serem comprados ou vendidos, tais como:
•
•
•
•
Número de identificação do produto, representado pelo atributo IdProduto.
O nome (descrição) do produto, representado pelo atributo Descricao.
O preço de venda do produto, representado pelo atributo PrecoVenda.
A quantidade disponível em estoque, representado pelo atributo QtdEstoque
A Figura 5.11 apresenta o diagrama de classe criado para representar a relação
criada no banco de dados Postgresql. O diagrama apresenta a classe Funcionarios, na qual
armazena informações sobre os funcionários (vendedores, atendentes e etc.), tais como:
5.4 Resultados obtidos
64
Figura 5.11: Relação Funcionarios criada no banco de dados
Postgresql.
•
•
•
•
•
•
Número de identificação do funcionário, representado pelo atributo IdFuncionario.
O nome do funcionário, representado pelo atributo NomeFuncionario.
A comissão do funcionário, representado pelo atributo Comissao.
O endereço do funcionário, representado pelo atributo Endereco.
A cidade do funcionário, representada pelo atributo Cidade.
O salário do funcionário, representado pelo atributo Salario.
Para ilustrar todo o domínio e a maneira como as consultas foram executadas, foi
criado um diagrama de classe contendo todas as relações, famílias de colunas e coleções
de documentos utilizadas no domínio. A Figura 5.12 apresenta o diagrama de classe e a
seguinte estrutura:
Figura 5.12: Relações utilizadas no experimento
• A família de colunas Vendas se relaciona:
5.4 Resultados obtidos
65
– com a família de colunas ItensVenda através do atributo IdVenda.
– com a coleção de documentos Clientes através do atributo IdCliente.
– com a coleção de documentos CondPag através do atributo IdCondPag.
• A família de colunas ItensVenda se relaciona:
– com a relação Produto através do atributo IdProduto.
• A relação EntradaNFe se relaciona:
– com a relação Funcionarios através do atributo IdFuncionario.
– com a coleção de documentos Fornecedor através do atributo IdFornecedor.
– com a relação ItensEntrada através do atributo IdEntrada.
• A relação ItensEntrada se relaciona:
– com a relação Produto através do atributo IdProduto.
Para realizar os experimentos, foram utilizados os bancos de dados relacionais
MSSQL Server 2008 Express e Postgresql 9.3, e os bancos de dados NOSQL Cassandra
2.1.2, da categoria orientado a colunas, e MongoDB 2.4.5, da categoria orientado a documentos. Os experimentos foram executados em um computador Dell Inspiron N5110,
processador Intel core i5, memória DDR3 de 6 GB, HD de 500 GB. Os bancos de dados
que armazenam as relações que compõe os metadados de conexão e de armazenamento,
bem como o depósito Resultados foram criados no banco de dados MSSQL Server 2008
Express.
A escolha pelo banco de dados MSSQL Server e Postgresql da categoria relacional se justifica pelo amplo material de apoio aos desenvolvedores, por ser um banco de
dados utilizado por grande parte das aplicações existentes, e, por ser classificado como relacional, oferece todos os recursos que a abordagem proporciona. A opção pelo Cassandra
como banco de dados NOSQL orientado a colunas se justifica por ser o banco de dados
da categoria NOSQL que mais se assemelha à abordagem relacional. O banco de dados
MongoDB foi escolhido devido a sua particularidade em armazenar os dados no formato
de documentos, e, por esse motivo, é um desafio encontrar um mecanismo que permita a
integração das três abordagens, relacional, orientado a colunas e orientado a documentos
na mesma aplicação. Uma justificativa que se aplica a todos os bancos de dados é que
ambos fornecem a API JDBC.
Várias consultas foram elaboradas contendo os seguintes elementos SQL: sum,
min, max, avg, count, join (e suas variações), group by, having, order by, between, in, and,
or, like, <, >, <=, >=. Além desses critérios, as consultas foram elaboradas para avaliar
diferentes situações em relação à distribuição dos dados nos bancos de dados disponíveis.
As consultas exemplificadas contêm relações e atributos dos diferentes bancos de dados
utilizados nos experimentos, nas seguintes combinações:
5.4 Resultados obtidos
•
•
•
•
•
•
•
•
•
•
66
Cassandra e MongoDB.
Cassandra, MongoDB e MSSQL Server.
Cassandra, MongoDB e Postgresql.
Cassandra, MongoDB, MSSQL Server e Postgresql.
Cassandra e Postgresql.
Cassandra e MSSQL Server.
MSSQL Server e MongoDB.
Cassandra, MSSQL Server e Postgresql.
Somente Cassandra.
MSSQL Server e Postgresql.
Figura 5.13: Ambiente dos experimentos
A Figura 5.13 apresenta um exemplo do ambiente em que uma aplicação se
comunica com os bancos de dados MSSQL Server, Postgresql, Cassandra e MongoDB.
Esse ambiente pode representar uma empresa do ramo varejista, acadêmico, industrial e
outros tipos de empresas que lidam com dados distribuídos em diferentes fontes de dados.
5.4.2
Exemplos de consultas
Os exemplos de consultas apresentados nesta seção foram elaborados considerando as várias formas de se construir uma consulta SQL. Foram construídas consultas
SQL envolvendo os quatro bancos de dados utilizados nos experimentos, mas não necessariamente utilizados ao mesmo tempo em todas as consultas. A cada exemplo apresentado, são informados quais bancos de dados foram utilizados.
5.4 Resultados obtidos
67
Consultas envolvendo apenas bancos de dados relacionais
Consulta 1: exemplo de consulta que acessa apenas um banco de dados relacional.
• Objetivo da consulta: apresentar todas as entradas de notas fiscais entre os dias
01/01/2015 e 01/05/2015.
• Relações utilizadas: EntradaNFe, ItensEntradaNFe.
• Banco de dados utilizado: MSSQL Server.
• Recursos SQL: inner join para junção, between para intervalo de datas, group by
para agrupamento e order by para ordenação.
O comando SQL correspondente à Consulta 1 é apresentado na Figura 5.14 e o
resultado da consulta é apresentado na Figura 5.15.
Figura 5.14: Exemplo - Consulta 1
Figura 5.15: Resultado da Consulta 1
Consulta 2: exemplo de consulta que acessa dois bancos de dados relacionais.
5.4 Resultados obtidos
68
• Objetivo da consulta: apresentar todas as entradas de notas fiscais entre os dias
01/01/2015 e 01/05/2015 e mostrar o funcionário que efetuou a venda, bem como
o nome do produto.
• Relações utilizadas: EntradaNFe, ItensEntradaNFe, Produto e Funcionários.
• Bancos de dados utilizados: MSSQL Server e Postgresql.
• Recursos SQL: inner join para junção, operadores >= e <= para intervalo de datas,
group by para agrupamento e order by para ordenação.
O comando SQL correspondente à Consulta 2 é apresentado na Figura 5.16 e o
resultado da consulta é apresentado na Figura 5.17.
Figura 5.16: Exemplo - Consulta 2
Figura 5.17: Resultado da Consulta 2
Consultas envolvendo apenas bancos de dados NOSQL
Sabe-se que os bancos de dados NOSQL não oferecem a utilização de determinados operadores, tais como: join, between group by, avg, min, max, sum e outros
5.4 Resultados obtidos
69
operadores. Entretanto, para demonstrar que a partir do método proposto é possível viabilizar essa necessidade, nesta seção serão apresentadas várias consultas SQL contendo
elementos que não são reconhecidos, de forma nativa, pelos bancos de dados NOSQL.
Consulta 3: exemplo de consulta que acessa dois bancos de dados NOSQL.
• Objetivo da consulta: apresentar todas as vendas efetuadas entre os dias
01/02/2015 e 01/05/2015 agrupadas por data da venda e cliente.
• Relações utilizadas: Vendas, Clientes e CondPag.
• Bancos de dados utilizados: Cassandra e MongoDB.
• Recursos SQL: atributos de cada relação que indicam relacionamento, between
para especificar o intervalo de datas, as para criação de alias, sum para somatório
de campos númericos, group by para agrupamento e order by para ordenação.
O comando SQL correspondente à Consulta 3 é apresentado na Figura 5.18 e o
resultado da consulta é apresentado na Figura 5.19.
Figura 5.18: Exemplo - Consulta 3
Figura 5.19: Resultado da Consulta 3
5.4 Resultados obtidos
70
Consulta 4: exemplo de consulta que acessa dois bancos de dados NOSQL.
• Objetivo da consulta: apresentar a quantidade das vendas efetuadas, agrupadas por
data da venda e cliente, das vendas efetuadas entre os dias 01/01/2015 e 01/07/2015.
• Relações utilizadas: Vendas, ItensVenda, Clientes e CondPag.
• Bancos de dados utilizados: Cassandra e MongoDB.
• Recursos SQL: inner join para junção, between para intervalo entre datas, count
para contagem, as para criar de alias, group by para agrupamento, having para filtrar
pelo resultado do campo agrupado e order by para ordenação.
O comando SQL correspondente à Consulta 4 é apresentado na Figura 5.20 e o
resultado da consulta é apresentado na Figura 5.21.
Figura 5.20: Exemplo - Consulta 4
Figura 5.21: Resultado da Consulta 4
Consulta 5: exemplo de consulta que acessa apenas um banco de dados NOSQL.
5.4 Resultados obtidos
71
• Objetivo da consulta: apresentar a média do valor total de vendas, agrupadas por
data da venda, das vendas efetuadas entre os dias 01/03/2015 e 01/06/2015.
• Relações utilizadas: Vendas, ItensVenda.
• Bancos de dados utilizados: Cassandra.
• Recursos SQL: inner join para junção, operadores >= e <= para intervalo de datas,
avg para média, group by para agrupamento e order by para ordenação.
O comando SQL correspondente à Consulta 5 é apresentado na Figura 5.22 e o
resultado da consulta é apresentado na Figura 5.23.
Figura 5.22: Exemplo - Consulta 5
Figura 5.23: Resultado da Consulta 5
Consulta 6: exemplo de consulta que acessa dois bancos de dados NOSQL.
• Objetivo da consulta: apresentar o valor mínimo, agrupado por data da venda, dos
produtos vendidos para a cliente Larissa de Assis Vilela entre os dias 01/03/2015 e
01/08/2015.
5.4 Resultados obtidos
72
• Relações utilizadas: Vendas, ItensVenda e Clientes.
• Bancos de dados utilizados: Cassandra e MongoDB.
• Recursos SQL: inner join para junção, between para intervalo de datas, as para
criação de alias, min para calcular o valor mínimo, group by para agrupamento e
order by para ordenação.
O comando SQL correspondente à Consulta 6 é apresentado na Figura 5.24 e o
resultado da consulta é apresentado na Figura 5.25.
Figura 5.24: Exemplo - Consulta 6
Figura 5.25: Resultado da Consulta 6
Consulta 7: exemplo de consulta que acessa dois bancos de dados NOSQL.
• Objetivo da consulta: apresentar o valor máximo, agrupados por data da venda,
dos produtos vendidos para todos os clientes, exceto para a cliente Larissa de Assis
Vilela, a partir do dia 01/05/2015.
5.4 Resultados obtidos
73
• Relações utilizadas: Vendas, ItensVenda e Clientes.
• Bancos de dados utilizados: Cassandra e MongoDB.
• Recursos SQL: inner join para junção, operadores >= para intervalo de datas, as
para criação de alias, max para calcular o valor máximo, group by para agrupamento
e order by para ordenação.
O comando SQL correspondente à Consulta 7 é apresentado na Figura 5.26 e o
resultado da consulta é apresentado na Figura 5.27.
Figura 5.26: Exemplo - Consulta 7
Figura 5.27: Resultado da Consulta 7
Consulta 8: exemplo de consulta que acessa dois bancos de dados NOSQL.
• Objetivo da consulta: apresentar a média de vendas, agrupadas por data da venda,
das vendas efetuadas entre os dias 01/03/2015 e 30/07/2015 de todos os clientes
cujo o nome comece com a letra L.
5.4 Resultados obtidos
74
• Relações utilizadas: Vendas e Clientes.
• Bancos de dados utilizados: Cassandra e MongoDB.
• Recursos SQL: inner join para junção, operadores >= e <= para intervalo de
datas, as para criação de alias, avg para calcular o valor médio, like para textos
aproximados, group by para agrupamento e order by para ordenação.
O comando SQL correspondente à Consulta 8 é apresentado na Figura 5.28 e o
resultado da consulta é apresentado na Figura 5.29.
Figura 5.28: Exemplo - Consulta 8
Figura 5.29: Resultado da Consulta 8
Consultas envolvendo bancos de dados relacionais e bancos de dados NOSQL
Consulta 9: exemplo de consulta que acessa um banco de dados relacional e um
banco de dados NOSQL.
5.4 Resultados obtidos
75
• Objetivo da consulta: apresentar as vendas efetuadas cujo número da venda,
representado pelo atributo IdVenda, seja igual a 1, 2, 3 ou 4.
• Relações utilizadas: Vendas, ItensVenda e Produto.
• Bancos de dados utilizados: Cassandra e MSSQL Server.
• Recursos SQL: inner join para junção, o operador in para especificar o intervalo
de números e order by para ordenação.
O comando SQL correspondente à Consulta 9 é apresentado na Figura 5.30 e o
resultado da consulta é apresentado na Figura 5.31.
Figura 5.30: Exemplo - Consulta 9
Figura 5.31: Resultado da Consulta 9
Consulta 10: exemplo de consulta que acessa dois bancos de dados relacionais
e um banco de dados NOSQL.
• Objetivo da consulta: apresentar a somatória da quantidade de produtos vendidos
por funcionário das vendas efetuadas entre os dias 01/03/2015 e 01/07/2015, em
5.4 Resultados obtidos
76
que contenha, entre a descrição do produto, a expressão "de", e exibir somente os
resultados cuja somatória da quantidade seja maior ou igual a 3.
• Relações utilizadas: Vendas, ItensVenda, Funcionarios e Produto.
• Bancos de dados utilizados: Cassandra, Postgresql e MSSQL Server.
• Recursos SQL: inner join para junção, between para intervalo de datas, sum para
somatória de campos númericos, like para textos aproximados, group by para
agrupamento, order by para ordenação e having para filtrar a partir da cláusula
group by.
O comando SQL correspondente à Consulta 10 é apresentado na Figura 5.32 e o
resultado da consulta é apresentado na Figura 5.33.
Figura 5.32: Exemplo - Consulta 10
Figura 5.33: Resultado da Consulta 10
Consulta 11: exemplo de consulta que acessa dois bancos de dados relacionais
e dois bancos de dados NOSQL.
5.4 Resultados obtidos
77
• Objetivo da consulta: apresentar as vendas efetuadas entre os dias 15/05/2015 e
01/07/2015 de todos os clientes cujo o nome inicie com a letra J.
• Relações utilizadas: Vendas, ItensVenda, Cliente, Funcionarios e Produto.
• Bancos de dados utilizados: Cassandra, MongoDB, Postgresql e MSSQL Server.
• Recursos SQL: inner join, left join, right join para junção, operadores >= e <= para
especificar intervalo de datas, like para textos aproximados, as para criação de alias,
order by para ordenação.
O comando SQL correspondente à Consulta 11 é apresentado na Figura 5.34 e o
resultado da consulta é apresentado na Figura 5.35.
Figura 5.34: Exemplo - Consulta 11
Figura 5.35: Resultado da Consulta 11
Após a execução dos experimentos, alguns aspectos referentes as consultas de
entrada e os resultados produzidos devem ser considerados:
5.5 Considerações Finais
78
• Algumas consultas foram escritas precedendo o atributo com o nome da relação
ao qual pertence. Essa restrição é válida se na consulta de entrada ou no mesmo
domínio houver dois ou mais atributos com o mesmo nome. Desta forma, é
necessário informar a relação que mantém o atributo para que a consulta seja
composta pelo atributo correto.
• Em consultas contendo intervalo entre datas, foram utilizados os operadores
between e >= e <=. Essa situação foi apresentada apenas para mostrar que existem as duas maneiras de especificar um intervalo de datas, mesmo se o atributo
estiver armazenado em um banco de dados NOSQL.
• Nos resultados de cada consulta, foram exibidos atributos que, inicialmente, não são
úteis para visualização, tais como: IdCliente, IdVenda, IdProduto e outros atributos
que indicam relacionamentos. Este fato ocorre pois, ao final de todos os processos,
a consulta de entrada é executada no depósito Resultados, e este depósito é criado
com base nas novas consultas SQL criadas para cada relação envolvida na consulta
de entrada e nos atributos de cada relação solicitados na consulta, como já foi
explicado anteriormente. Portanto, no depósito de Resultados devem conter todos
os atributos solicitados na consulta de entrada, inclusive os atributos que indicam
relacionamentos.
Os resultados obtidos mostram que o acesso aos bancos de dados relacionais
e NOSQL através de uma única consulta foi possível através do driver JDBC de cada
banco de dados. Ao receber a consulta no padrão SQL, o driver JDBC faz o mapeamento
dos elementos SQL para cada banco de dados, relacional ou NOSQL. Portanto, para a
viabilidade do método, é indispensável a utilização do driver JDBC de cada banco de
dados acessível pelo método.
A partir da utilização do protótipo e dos resultados obtidos, foi possível analisar
que a configuração dos metadados de conexão e armazenamento deve ser realizada por
pessoas que conhecem o domínio sobre o qual as consultas serão executadas. Isso se deve
ao fato de que, na abordagem adotada neste trabalho, os metadados são configurados
manualmente, sendo indispensável a interação de uma pessoa com o protótipo.
5.5
Considerações Finais
Neste capítulo foi apresentado e ilustrado o protótipo desenvolvido para aplicar
o método proposto. Foram discutidas todas as configurações realizadas para acessar
os bancos de dados envolvidos na consulta, bem como as configuração das relações e
atributos dos bancos de dados acessíveis pelo protótipo. A partir da implementação do
protótipo, foi possível validar o método proposto neste trabalho e verificar que é possível
5.5 Considerações Finais
79
realizar a integração de dados armazenados em bancos de dados relacionais e NOSQL,
e utilizar elementos SQL em consultas executadas em bancos de dados NOSQL. No
próximo capítulo serão discutidas as conclusões e trabalhos futuros.
CAPÍTULO 6
Conclusão
Este trabalho propõe um método de integração de dados armazenados em bancos
de dados de diferentes abordagens. O método permite o acesso a dados armazenados
em bancos de dados distribuídos e de diferentes modelos, para dar resposta a uma
única consulta escrita em SQL, que pode conter elementos SQL não reconhecidos por
determinadas abordagens de bancos de dados.
Convém destacar que bancos de dados NOSQL não oferecem, de forma nativa,
acesso aos dados que armazenam por meio de comandos SQL. O presente método, com
o propósito de padronizar a forma de acesso às fontes de dados disponíveis adotou a API
JDBC. Em consequência, qualquer que seja a fonte de dados, a existência de um driver
JDBC correspondente é obrigatória.
O método é capaz de analisar a consulta inicial, identificar os bancos de dados,
as relações e os atributos envolvidos. Após esse procedimento, a partir da consulta inicial,
são geradas consultas SQL específicas para cada banco de dados contendo informações
relevantes para a consulta. Os resultados obtidos pelas consultas específicas são armazenados temporariamente em um banco de dados relacional, o que torna possível submeter
a consulta inicial e obter o resultado final, composto por dados previamente recuperados
de vários bancos de dados.
Este trabalho foi inspirado em [45], no qual é proposto um método de integração
de dados entre bancos de dados relacionais e NOSQL. Entretanto, o método proposto
neste trabalho permite a utilização da linguagem de consulta SQL como meio padrão de
consulta dos dados. Como consequência, é permitida a utilização de elementos SQL, tais
como sum, count, join e outros elementos, mesmo que os dados estejam armazenados em
bancos de dados NOSQL.
As próximas seções apresentam as contribuições, os trabalhos futuros e os
trabalhos produzidos durante o desenvolvimento desta dissertação.
6.1 Contribuições
6.1
81
Contribuições
Nesta seção são apresentadas as principais contribuições com o desenvolvimento
deste trabalho.
• Permitir acessar fontes de dados de diferentes abordagens através de uma única
consulta SQL: os dados solicitados em uma consulta podem estar armazenados
em diferentes fontes de dados, porém, uma consulta SQL de entrada contendo as
relações e atributos desejados é o suficiente para retornar o resultado.
• Fornecer um mecanismo homogêneo de acesso aos bancos de dados: a API JDBC é
utilizada para fornecer uma interface de comunicação entre a aplicação e os bancos
de dados envolvidos na consulta.
• Permitir a construção de consultas SQL para cada banco de dados envolvidos
na consulta inicial: a partir da consulta SQL de entrada, o método é capaz de
identificar, através de metadados previamente configurados, as relações, atributos
e os bancos de dados em que os dados estão armazenados.
• Executar consultas SQL contendo elementos não reconhecidos pela abordagem
NOSQL: a utilização da linguagem de consulta SQL como meio de consulta aos
dados, permite executar consultas com sum, count, join e outros elementos SQL.
• Permitir integração de dados armazenados em bancos de dados relacionais e
NOSQL: os dados armazenados em bancos de dados relacionais e NOSQL são
consultados através de uma única consulta, e os resultados produzidos em cada
banco de dados são apresentados de forma unificada.
6.2
Trabalhos Futuros
Durante o desenvolvimento do trabalho foram identificados vários aspectos que
podem contribuir para o aprimoramento do método proposto. Dentre eles, estão:
• Permitir consultas não necessariamente no padrão SQL: para executar consultas
utilizando o método proposto, é necessário informar uma consulta no padrão SQL e
respeitar rigorosamente a sintaxe SQL. Uma alternativa seria disponibilizar outras
formas de se submeter uma consulta SQL, mesmo não sendo no padrão SQL.
• Permitir a integração de dados considerando outras fontes de dados: o método
proposto reconhece apenas os bancos de dados relacionais e NOSQL. A integração
de dados com outras fontes de dados poderiam ser implementadas, tais como:
arquivos texto, arquivos XML, emails e outras fontes de dados.
• Permitir a integração de dados entre bancos de dados relacionais e outras categorias de bancos de dados NOSQL: neste trabalho foram considerados apenas bancos
6.2 Trabalhos Futuros
82
de dados relacionais e as categorias NOSQL orientado a colunas e orientado a documentos. Entretanto, é importante realizar a integração entre outras categorias de
bancos de dados NOSQL, tais como: orientado a grafos, chave-valor, bancos de
dados XML e outros.
• Avaliar o desempenho do método de integração de dados em situações reais:
devido às características do trabalho aqui proposto, durante o seu desenvolvimento
não foi possível encontrar um ambiente real para executar os experimentos. Em
um ambiente real contendo bancos de dados relacionais e NOSQL, seria possível
avaliar melhor o método proposto.
• Permitir a execução de operações inserção, alteração e exclusão de dados: este
trabalho foi desenvolvido considerando apenas a operação de consulta. Permitir
outras operações SQL significa construir um método completo que contemple todas
as operações.
• Permitir utilizar outros elementos SQL não contemplados neste trabalho: o método
proposto neste trabalho permite realizar consultas contendo elementos SQL não
reconhecidos pelos bancos de dados NOSQL, como: sum, count, min, max, avg,
join, in, and, or, like, between. No entanto, não são todos os elementos SQL que
são aceitos neste trabalho. Permitir executar consultas contendo, por exemplo:
subconsultas, inserção de dados através de consultas e até mesmo contemplar
as especificidades de cada banco de dados é importante para o método executar
quaisquer elementos da linguagem SQL.
APÊNDICE A
Dados para executar os experimentos
As tabelas a seguir apresentam os dados utilizados para realizar os experimentos.
Coleção de documentos Clientes
IdClienteC
Nome
1
Flavio Vilela
2
Cidade
Telefone
Rua Voluntarios
da Patria, 353
Jatai
6436311873
Jose Caetano de Assis
Rua Miguel de
Assis, 1153
Jatai
6436325487
3
Joao Caetano de Assis
Rua Riachuello,
451
Goiania
6436254874
4
Pedro Jose dos Santos
Rua Pires do Rio,
1251
Goiania
6236124874
Jatai
6436361254
Goiania
6432546321
5
Endereco
Joaquim Caetano de Assis Avenida Voluntarios da Patria, 121
6
Junior dos Santos
Avenida
222
Goias,
7
Larissa de Assis Vilela
Avenida Presidente
Vargas,
562
8
Lorena de Assis Vilela
Rua da saudade,
221
Acreuna 6436456321
Jatai
Tabela A.1: Dados armazenados na coleção de documentos Clientes
6436312102
APÊNDICE A. DADOS PARA EXECUTAR OS EXPERIMENTOS
84
Coleção de documentos CondPag
IdCondPag
DescricaoCP
1
Dinheiro
2
Cartao
3
Cheque
4
Promissoria
Tabela A.2: Dados armazenados na coleção de documentos CondPag
Coleção de documentos Fornecedor
IdFornecedor RazaoSocial
CNPJ
Endereco
Cidade
1
JR Distribuidora
123456-1
Rua X, 223
Jatai-GO
2
Vilela Implementos 456123-2
Agricolas
Rua Y, 2301
Jatai-GO
3
MKT Pecas e Aces- 854565-1
sorios
Rua Z, 32
Jatai-GO
4
Coringa das Rodas 201202-1 Rua K, 1200
LTDA
Jatai-GO
5
FAV Molas e Parafu- 784452-8
sos
Jatai-GO
6
Junior Auto Pecas e 552211-8 Rua A, 1256 Goiania-GO
Distribuidora LTDA
7
Comando
Agricolas
Pecas 200112-3
Rua C, 556
Goiania-GO
8
Reg Implementos e 885696-5
Pecas
Rua C, 452
Goiania-GO
9
Distribuidora Lopes 102325-6
LTDA
Rua C, 5655
Goiania-GO
10
Trovao Pecas e Im- 452123-9
plementos
Rua B, 6633
Goiania-GO
Rua W, 56
Tabela A.3: Dados armazenados na coleção de documentos Fornecedor
APÊNDICE A. DADOS PARA EXECUTAR OS EXPERIMENTOS
85
Família de colunas Vendas
IdVenda
IdCliente IdCondPag IdFuncionario DataVenda
1
1
1
1
2015-02-01
2
1
2
2
2015-02-02
3
2
2
3
2015-03-03
4
2
1
4
2015-03-15
5
3
1
5
2015-04-20
6
3
1
1
2015-04-22
7
4
2
2
2015-05-31
8
7
2
3
2015-05-06
9
5
2
4
2015-06-10
10
6
1
5
2015-06-19
11
1
1
1
2015-02-20
12
1
2
2
2015-02-22
13
2
2
3
2015-03-21
14
2
1
4
2015-03-20
15
7
3
5
2015-04-24
16
3
4
1
2015-04-30
17
4
3
2
2015-05-01
18
4
3
3
2015-05-01
19
5
2
4
2015-06-01
20
6
4
5
2015-06-01
21
6
4
1
2015-06-20
22
7
4
2
2015-07-05
23
6
1
3
2015-07-10
24
8
2
4
2015-07-02
25
6
3
5
2015-07-03
26
7
3
1
2015-08-02
27
6
2
2
2015-08-02
28
1
2
3
2015-08-03
29
2
4
4
2015-09-15
30
3
1
5
2015-09-20
Tabela A.4: Dados armazenados na família de colunas vendas
Família de colunas ItensVendas
IdVenda IdProduto
1
1
PrecoUnitario Quantidade SubTotal
10
2
20
APÊNDICE A. DADOS PARA EXECUTAR OS EXPERIMENTOS
86
1
2
20
4
80
1
3
30
2
60
1
4
35
2
70
1
5
50
2
100
1
6
5
2
10
2
2
35
2
70
2
1
10
2
20
2
3
5
2
10
3
3
5
2
10
3
4
7
2
14
3
1
5
2
10
4
1
100
3
300
4
2
200
5
1000
4
3
300
3
900
4
4
350
3
1050
4
5
500
2
1000
4
6
50
1
50
5
1
350
2
700
5
2
100
4
400
5
3
50
1
50
6
1
50
1
50
6
8
70
2
140
6
7
10
3
30
6
9
20
1
20
7
1
20
3
60
7
4
30
5
150
7
3
40
4
160
7
5
55
3
165
8
2
55
3
165
8
1
44
8
352
8
3
64
3
192
8
4
70
4
280
9
6
88
3
264
9
5
99
5
495
9
1
77
3
231
9
2
44
6
264
APÊNDICE A. DADOS PARA EXECUTAR OS EXPERIMENTOS
87
10
2
45
3
135
10
1
20
6
120
10
3
20
3
60
10
4
11
7
77
10
6
22
8
10
10
10
32
1
32
11
1
31
9
279
11
2
30
2
60
11
3
10
3
30
11
4
55
4
220
12
2
20
1
20
12
3
10
2
20
12
5
54
5
270
12
6
56
6
336
12
8
70
1
70
13
7
80
2
160
13
9
99
3
297
13
8
500
4
2000
13
4
501
8
4008
14
4
40
4
160
14
5
44
5
220
15
6
55
2
110
15
5
44
1
44
15
2
11
1
11
15
1
24
1
24
15
7
26
2
52
15
9
27
3
81
15
10
28
2
56
15
8
45
2
90
16
1
65
3
195
16
2
10
4
40
16
3
15
5
75
16
4
25
3
75
16
5
35
7
245
17
1
70
3
210
17
5
40
7
280
APÊNDICE A. DADOS PARA EXECUTAR OS EXPERIMENTOS
88
17
6
15
3
45
17
7
16
3
48
17
8
30
3
30
18
1
10
8
80
18
2
25
9
225
18
3
10
3
30
18
4
30
1
30
19
2
24
3
72
19
5
26
2
52
20
4
35
3
105
20
6
40
2
80
20
7
60
3
180
20
8
70
1
70
21
2
80
3
240
21
3
90
2
180
21
5
77
3
231
21
4
10
2
20
21
8
40
3
120
22
7
60
7
420
22
8
20
2
20
22
9
14
2
28
22
10
10
2
20
23
2
30
1
30
23
3
10
1
10
24
4
5
2
10
24
5
7
2
14
24
6
95
2
190
24
7
10
2
20
25
1
41
3
123
25
2
12
1
12
25
8
35
3
105
26
8
63
3
189
26
9
32
2
64
27
10
41
2
82
27
8
25
1
25
27
7
26
3
78
APÊNDICE A. DADOS PARA EXECUTAR OS EXPERIMENTOS
89
27
4
70
2
140
28
1
51
2
102
28
2
13
1
13
28
3
10
3
13
28
4
70
1
70
29
8
5
2
10
29
7
6
2
12
30
9
50
2
100
30
7
70
4
280
30
8
20
3
60
30
4
80
5
400
30
5
50
3
150
Tabela A.5: Dados armazenados na família de colunas ItensVendas
Relação Produto
IdProduto
DescricaoProduto
Codigo
1
Prato descartável
123
2
4
2
Colher de metal
3322
1.5
3
3
Prato de video
929281
10
2
4
Relogio Casio
3939
10
2
5
Livro de Android
883
100
3
6
Livro de java
788854
150
5
7
Bolsa Company
992222
1500
2
550
8
8
Celular Black Barry 28282811
PrecoUnitario Estoque
9
Celular Nexus 5
22828919
600
9
10
Mouse Lazer
399322
25
2
Tabela A.6: Dados armazenados na relação Produto
APÊNDICE A. DADOS PARA EXECUTAR OS EXPERIMENTOS
90
Relação Funcionarios
IdFuncionario NomeFuncionario
Endereco
Comissao
Cidade
Salario
1
José Pereira
Rua A, 12
2
Goiania
1000
2
João da Silva
Rua B, 13
2
Goiania
2000
3
Joaquim de Moura
Rua C, 14
3
Goiania
900
4
Felipe Alves
Rua D, 15
3
Jataí
1000
5
Flávio Vilela
Rua E, 16
2
Jataí
3000
Tabela A.7: Dados armazenados na relação Funcionarios
Relação EntradaNFe
IdEntrada IdFornecedor IdFuncionario DataEntrada
ValorTotal
1
1
1
2014-06-25
89
2
2
1
2014-06-25
344
3
4
2
2014-06-20
107
4
2
3
2014-02-01
96
5
3
3
2015-02-15
195
6
2
2
2015-03-03
46
7
1
4
2015-02-20
1579
8
3
4
2015-03-15
148
9
4
5
2015-04-04
407
10
3
4
2015-01-01
1059
11
6
2
2015-04-01
144
12
7
3
2014-09-15
149
13
8
1
2014-01-01
196
14
7
3
2014-12-01
110
15
8
2
2014-11-19
199
16
9
4
2014-09-20
191
17
10
2
2014-09-21
211
18
9
5
2014-11-20
21
19
7
1
2015-12-19
234
20
10
3
2015-11-20
211
Tabela A.8: Dados armazenados na relação EntradaNFe
Relação ItensEntrada
IdEntrada IdProduto ValorCompra Quantidade SubTotal
1
1
10
2
20
APÊNDICE A. DADOS PARA EXECUTAR OS EXPERIMENTOS
91
1
2
20
2
40
1
3
5
3
15
1
4
7
2
14
2
5
50
2
100
2
6
60
1
60
2
7
30
3
90
2
8
20
3
60
2
9
3
3
9
2
10
5
5
25
3
1
10
3
30
3
2
20
3
60
3
3
5
2
10
3
4
7
1
7
4
5
6
1
6
4
6
60
1
60
4
7
15
2
30
5
8
5
2
10
5
9
3
5
15
5
10
10
5
50
5
1
10
5
50
5
2
20
3
60
5
3
5
2
10
6
4
7
3
21
6
5
5
5
25
7
6
60
10
600
7
7
30
30
900
7
8
5
10
50
7
9
3
3
9
7
10
10
2
20
8
1
10
3
30
8
2
20
3
60
8
3
5
5
25
8
4
7
4
28
8
5
5
1
5
9
6
60
5
300
9
7
30
2
60
APÊNDICE A. DADOS PARA EXECUTAR OS EXPERIMENTOS
92
9
8
5
5
25
9
9
3
4
12
9
10
10
1
10
10
1
10
2
20
10
2
20
30
600
10
3
5
5
25
10
4
7
7
49
10
5
5
1
5
10
6
60
6
360
11
7
30
2
60
11
8
5
3
15
11
9
3
3
9
11
10
10
3
30
11
1
10
63
30
12
2
20
60
120
12
3
5
1
5
12
4
7
2
14
12
5
5
2
10
13
6
60
2
120
13
7
30
2
60
13
8
5
2
10
13
9
3
2
6
14
10
10
2
20
14
1
10
2
20
14
2
20
3
60
14
3
5
2
10
15
4
7
2
14
15
5
5
1
5
15
6
60
3
180
16
7
30
2
60
16
8
5
2
10
16
9
3
2
6
16
10
10
2
20
16
1
10
3
30
16
2
20
2
40
16
3
5
5
25
APÊNDICE A. DADOS PARA EXECUTAR OS EXPERIMENTOS
93
17
4
7
3
21
17
5
5
2
10
17
6
60
2
120
17
7
30
2
60
18
8
5
1
5
18
9
3
2
6
18
10
10
1
10
19
1
10
5
50
19
2
20
8
160
19
3
5
2
10
19
4
7
2
14
20
5
5
5
25
20
6
60
2
120
20
7
30
1
30
20
8
5
2
10
20
9
3
2
6
20
10
10
2
20
Tabela A.9: Dados armazenados na relação ItensEntrada
Referências Bibliográficas
[1] A BRAMOVA , V.; B ERNARDINO, J.
Nosql databases - mongodb vs cassandra.
Proceedings of the International C* Conference on Computer Science and Software
Engineering (C3S2E ’13), 1:14–22, 2013.
[2] B ARBULESCU, M.; G RIGORIU, R.-O.; H ALCU, I.; N ECULOIU, G.; S ANDULESCU, V IR GINIA ,
C.; M ARINESCU, M.; M ARINESCU, V.
Integrating of structured, semi-
structured and unstructured data in natural and build environmental engineering. Roedunet International Conference (RoEduNet), 2013 11th, 1:1–4, 2013.
[3] B LUMBERG , R.; ATRE , S. The Problem with Unstructured Data. DM Review, 2003.
[4] C ALIL , A.; DOS S ANTOS , M ELLO, R. Simplesql: A relational layer for simpledb.
ADBIS’12 Proceedings of the 16th East European conference on Advances in Databases and Information Systems, 1:99–110, 2012.
[5] C ASSANDRA .
Cassandra
jdbc
driver,
12
2014.
https://code.google.com/a/apache-extras.org/p/cassandra-jdbc/.
Disponível
Acesso
em:
em:
5
dez. 2014.
Cassandra query language (cql).
[6] C ASSANDRA , A.
Disponível em:
https://cassandra.apache.org/doc/cql3/CQL.html. Acesso em: 4 set. 2014.
[7] C ASSANDRA , A.
Apache cassandra documentation, 2015.
Disponível em:
http://docs.datastax.com/en/cassandra/2.0/cassandra/gettingStartedCassandraIntro.html.
Acesso em: 15 dez. 2014.
[8] C ATTELL , R. Scalable sql and nosql data stores. ACM SIGMOD Record, 39(4):12–
27, Dezembro 2010.
[9] C HUNG , W.-C.; L IN , H.-P.; C HEN , S.-C.; J IANG , M.-F.; C HUNG , Y.-C. Jackhare:
a framework for sql to nosql translation using mapreduce. Automated Software
Engineering, 21:489–508, 2013.
[10] DOS S ANTOS , F ERREIRA , G.; C ALIL , A.; DOS S ANTOS , M ELLO, R. On providing
ddl support for a relational layer over a document nosql database. IIWAS ’13
REFERÊNCIAS BIBLIOGRÁFICAS
95
Proceedings of International Conference on Information Integration and Web-based
Applications & Services, 1:1–8, 2013.
[11] D UGGAN , J.; E LMORE , A ARON , J.; S TONEBRAKER , M.; B ALAZINSKA , M.; H OWE , B.
The bigdawg polystore system. SIGMOD Record, 44:11–16, 2015.
[12] G EETHA , S.; M ALA , D. G. S. A.
unstructured data.
Effectual extraction of data relations from
Third International Conference on Sustainable Energy and
Intelligent System, 1:1–4, 2012.
[13] H AN , J.; E, H.; L E , G.; D U, J. Survey on nosql database. In Proceedings of 6th
International Conference on Pervasive Computing and Applications (ICPCA 2011),
1:363–366, Outubro 2011.
[14] H ECHT, R.; J ABLONSKI , S. Nosql evaluation - a use case oriented survey. 2011
International Conference on Cloud and Service Computing, 1:336–341, Dezembro
2011.
[15] J ATANA , N.; P URI , S.; A HUJA , M.; K ATHURIA , I.; G OSAIN , D.
A survey and
comparison of relational and non-relational database. International Journal of
Engineering Research & Technology (IJERT), 1(6):1–5, 2012.
[16] KOZLOVA , I.; R ITTER , N.; R EIMER , O. Towards integrated query processing for
object-relational and xml data sources. 10th International Database Engineering
and Applications Symposium, 1:1, 2006.
[17] L AWRENCE , R. Integration and virtualization of relational sql and nosql systems
including mysql and mongodb. 2014 International Conference on Computational
Science and Computational Intelligence (CSCI), 1:285 – 290, 2014.
[18] L EAVITT, N. Will nosql databases live up to their promise? In IEEE Computer,
43(2):12–14, 2010.
[19] L I , Y.; M ANOHARAN , S. A performance comparison of sql and nosql databases.
Communications, Computers and Signal Processing (PACRIM), 2013 IEEE Pacific
Rim Conference on, 23:15–19, 2013.
[20] M C G REAL , R. Learning objects and metadata understanding the field. International Workshop on Technology for Education (T4E), 1:49 – 53, 2009.
[21] M OHAMED, M OHAMED, A.; A LTRAFI , O BAY, G.; I SMAIL , M OHAMMED, O. Relational
vs. nosql databases: A survey. International Journal of Computer and Information
Technology (ISSN: 2279 – 0764), 3(3):598–601, 2014.
REFERÊNCIAS BIBLIOGRÁFICAS
Introduction
[22] M ONGO DB.
96
to
mongodb,
2
2015.
Disponível
em:
http://docs.mongodb.org/manual/reference/sql-comparison/. Acesso em: 5 fev.
2015.
[23] M ONGO DB, U.
Jdbc driver for mongodb, 2014 12.
Disponível em:
http://www.unityjdbc.com/mongojdbc/mongojdbc.php. Acesso em: 15 dez. 2014.
[24] M ONIRUZZAMAN , A. B. M.; H OSSAIN , S YED, A. Nosql database - new era of databases for big data analytics - classification, characteristics and comparison.
International Journal of Database Theory and Application, 6:1–14, 2013.
[25] N ANCE , C.; L OSSER , T.; I YPE , R.; H ARMON , G. Nosql vs rdbms - why there is
room for both. Proceedings of the Southern Association for Information Systems
Conference, Savannah, GA, USA., 27:111–116, 2013.
[26] NOSQL.
List of nosql databases, 1 2015.
Disponível em: http://nosql-
database.org. Acesso em: 20 jan. 2014.
[27] N YATI , S. S. Performance evaluation of unstructured nosql data over distributed
framework. Advances in Computing, Communications and Informatics (ICACCI),
2013 International Conference on, 1:1623 – 1627, 2013.
[28] PARKER , Z.; P OE , S.; V RBSKY, S. V. Comparing nosql mongodb to an sql db.
Proceedings of the 51st ACM Southeast Conference, 5:1–6, 2013.
[29] P OKORNY, J. Nosql databases: a step to database scalability in web environment. Proceedings of the 13th International Conference on Information Integration
and Web-based Applications and Services, iiWAS’11, 9:278–283, 2011.
[30] PRESS, N. Understanding Metadata. National Information Standards Organization, 2004.
[31] R AMAKRISHNAN , R.; G EHRKE , J. Database Management System. McGraw-Hili,
2003.
[32] R OUT, T.; G ARANAYAK , M.; S ENAPATI , M ANAS , R.; K AMILLA , S USHANTA , K. Big data
and its applications: A review. International Conference on Electrical, Electronics,
Signals, Communication and Optimization (EESCO) - 2015, 1:1–5, 2015.
[33] S CHRAM , A. Mysql to nosql data modeling challenges in supporting scalability.
Proceedings of the 3rd annual conference on Systems, programming, and applications: software for humanity, 1:191–202, 2012.
REFERÊNCIAS BIBLIOGRÁFICAS
97
[34] S ILVA , J OÃO, C.; KOWATA , E. T.; V INCENZI , A. M. R. Extracting and exposing
relational database metadata on the web. Proceedings of IADIS International
Conference WWW/Internet. Madrid, Spain, 1:35–42, 2012.
[35] S MULLEN , C LINTON , W.; TARAPORE , S HAHRUKH , R.; G URUMURTHI , S. A benchmark suite for unstructured data processing. Fourth International Workshop on
Storage Network Architecture and Parallel I/Os, 1:79 – 83, 2008.
[36] S OMMERVILLE , I. Engenharia de Software. Pearson, 2011.
[37] S TONEBRAKER , M.; M ADDEN , S.; A BADI , DANIEL , J.; H ARIZOPOULOS , S.; H ACHEM ,
N.; H ELLAND, P. The end of an architectural era. VLDB ’07 Proceedings of the
33rd international conference on Very large data bases, 1:1150–1160, 2007.
[38] S U, J.; FAN , R.; L I , X. Research and design of heterogeneous data integration
middleware based on xml. Intelligent Computing and Intelligent Systems (ICIS),
2010 IEEE International Conference on, 2:850 – 854, 2010.
[39] TAURO, C LARENCE , J. M.; A RAVINDH , S.; A, B. S. Comparative study of the new
generation, agile, scalable, high performance nosql databases. International
Journal of Computer Applications (0975 888), 48:1–4, Junho 2012.
[40] T UDORICA , B OGDAN , G.; B UCUR , C. A comparison between several nosql databases with comments and notes. Roedunet International Conference (RoEduNet),
2011 10th, 5:1 – 5, 2011.
[41] VANGIPURAM , R. K.; S REEKANTH , V.; R ANGASWAMY, B. Implementation of web-etl
transformation with pre-configured multi-source system connection and transformation mapping statistics report. 3rd International Conference on Advanced
Computer Theory and Engineering(ICACTE), 2:317–322, 2010.
[42] WANG , G.; TANG , J. The nosql principles and basic application of cassandra
model. Computer Science & Service System (CSSS), 2012 International Conference
on, 1:1332 – 1335, 2012.
[43] W EI - PING , Z.; M ING - XIN , L.; H UAN , C. Using mongodb to implement textbook
management system instead of mysql. Communication Software and Networks
(ICCSN), 2011 IEEE 3rd International Conference on, 11:303 – 305, 2011.
[44] W ILEY, J. Practical Database Programming with Java Chapter 3 - JDBC API and
JDBC Drivers. Ying Bai, 1 edition, 2011.
REFERÊNCIAS BIBLIOGRÁFICAS
98
[45] Z HANG , H.; WANG , Y.; H AN , J.
Middleware design for integrating relational
database and nosql based on data dictionary. 2011 International Conference on
Transportation, Mechanical, and Electrical Engineering (TMEE), 1:1469–1472, 2011.
[46] Z HANG , H.; Z HANG , L.- Y. Jdbc-based middleware applications in instant message systems. 2nd International Conference on Systems and Informatics (ICSAI
2014), 1:1044 – 1049, 2014.
Download

Um método de integração de dados armazenados em bancos