introduction
Os bancos de dados NoSQL realizam operação de inserção e recuperação de dados utilizando outro modelo que não seja o relacional. Esses bancos tem como principais características velocidade e alta taxa de escalabilidade, eles estão sendo adotados com maior frequência em diversos tipos de aplicações, inclusive, aplicações para as instituições financeiras. Como consequência, cresce também o número de fornecedores para esse tipo de banco de dados.
Basicamente os bancos de dados NOSQL são classificados em quatro grupos que são definidos pelo seu modelo de armazenamento:
Chave-valor
Possui uma estrutura muito semelhante à do java.util.Map, onde podemos armazenar uma chave e seu valor. Normalmente esse valor pode ser qualquer informação.
Exemplos:
AmazonDynamo
AmazonS3
Redis
Scalaris
Voldemort
Estrutura relacional
Estrutura chave-valor
Table
Bucket
Row
Key/value pair
Column
----
Relationship
----
Orientado a documentos
Este modelo permite armazenar qualquer documento, sem ter a necessidade de definir previamente sua estrutura. O documento é composto por inúmeros campos, com tipos de dados diversos, inclusive um campo pode conter um outro documento, um banco de dados NoSQL orientado a documentos possui uma estrutura semelhante a de um arquivo XML.
Exemplos:
AmazonSimpleDb
ApacheCouchdb
MongoDb
Riak
Estrutura relacional
Estrutura de documentos
Table
Collection
Row
Document
Column
Key/value pair
Relationship
Link
Família de colunas
Esse modelo se tornou popular através do paper BigTable do Google, com o objetivo de montar um sistema de armazenamento de dados distribuído, projetado para ter um alto grau de escalabilidade e de volume de dados.
Exemplos:
Hbase
Cassandra
Scylla
Clouddata
SimpleDb
DynamoDB
Estrutura relacional
Estrutura de família de colunas
Table
Column Family
Row
Column
Column
Key/value pair
Relationship
not supported
Grafos
É uma estrutura de dados que conecta um conjunto de vértices através de um conjunto de arestas. Os bancos modernos dessa categoria suportam estruturas de grafo multi-relacionais, onde existem diferentes tipos de vértices (representando pessoas, lugares, itens) e diferentes tipos de arestas.
Exemplos:
Neo4j
InfoGrid
Sones
HyperGraphDB
Estrutura relacional
Estrutura de grafos
Table
Vertex and Edge
Row
Vertex
Column
Vertex and Edge property
Relationship
Edge
Multi-model database
Alguns bancos de dados possuem a comum característica de ter suporte de um ou mais modelos apresentados anteriormente.
Exemplos:
OrientDB
Couchbase
Comparando com as aplicações Java que utilizam bancos relacionais
É uma boa prática ter uma camada que é responsável por realizar a comunicação entre o banco de dados e o modelo, o bom e velho Data Acess Object ou DAO. Essa camada contém toda a API de comunicação com o banco de dados, olhando para o paradigma dos bancos relacionais, existem diversos fornecedores, porém, com o padrão JPA o desenvolvedor Java tem algumas vantagens:
Não existe lock-in com um fornecedor, ou seja, com o padrão a mudança acontece de maneira bem simples e transparente, sendo apenas necessário realizar a troca do driver.
Não é necessário aprender uma nova API para um novo banco de dados uma vez que a API é comum entre todos os bancos de dados.
Impacto praticamente zero ao mudar de fornecedor para outro, em alguns momentos é necessário utilizar um recurso específico de um banco de dados, mas mesmo nesses casos não se perde toda a camada DAO.
Nos bancos de dados NOSQL não existe nenhum padrão pré estabelecido atualmente, assim os desenvolvedores Java enfrentam os seguintes problemas:
Lock-in com um fornecedor
Para um novo banco de dados é necessário aprender uma nova API.
Para qualquer mudança de banco de dados o impacto é altíssimo, se perde praticamente toda a camada DAO uma vez que a API muda completamente. Isso acontece mesmo que a mudança ocorra dentro do mesmo grupo do banco NOSQL inicial, por exemplo mudar de um banco família de coluna para outro banco família de coluna.
Com esse problema, existe um grande esforço ao criar uma API comuns entre esses bancos de dados. É o caso do Spring Data, Hibernate ORM e o TopLink. Como a API JPA já é uma camada muito conhecida entre os desenvolvedores Java, ela é comumente utilizada para facilitar o mapeamento, porém, o seu foco é para os bancos relacionais, por este motivo a JPA não é suficiente para cobrir todas as necessidades dos bancos NOSQL, por exemplo, muitos bancos NOSQL não possuem transação e também não é possível realizar uma inserção de forma assíncrona com a API JPA. Assim, infelizmente apesar de a JPA ser uma boa API ela não contempla todos os comportamentos existentes nos bancos não relacionais.
Muitos bancos não relacionais vem surgindo no mundo do desenvolvimento de software e estão sendo adotados em larga escala no mundo Java, por exemplo, na última pesquisa sobre Java EE o número de aplicações que usavam essa tecnolgia para armazenamento chegava a quase 50%. Permitir a criação do padrão facilitará o trabalho do desenvolvedor Java, uma vez que não será necessário aprender uma nova API caso se deseje trocar de fornecedor. Porém, assim como nos bancos relacionais, utilizar recursos específicos de um banco de dados fará com que você perca o suporte da API, mas geralmente a maioria das aplicações tem o costume de utilizar a API padrão, ou seja, mesmo que o custo da migração não seja zero, será em uma escala bem menor comparado o atualmente.
Last updated