NOSQL
MANUAL noSQL¶
Versão 1.0
01. O que é¶
NoSQL (Not Only SQL) é um termo genérico que se refere a bancos de dados não relacionais que oferecem uma abordagem diferente daquela encontrada em bancos de dados relacionais tradicionais. Os bancos de dados NoSQL são projetados para atender a requisitos de escalabilidade, desempenho e flexibilidade, com foco em modelos de dados não estruturados ou semiestruturados.
Principais características dos bancos de dados NoSQL:
Modelos de Dados Flexíveis: Permitem armazenar e manipular dados sem uma estrutura rígida, como em bancos de dados relacionais.
Escalabilidade Horizontal: São projetados para escalabilidade horizontal, permitindo que os dados sejam distribuídos em vários servidores.
Desenvolvimento Ágil: São frequentemente utilizados em ambientes que exigem flexibilidade no esquema de dados e desenvolvimento ágil.
Alta Disponibilidade e Tolerância a Falhas: Muitos bancos de dados NoSQL são projetados para oferecer alta disponibilidade e capacidade de lidar com falhas de hardware.
Diversos Tipos de Dados: Podem armazenar e processar diferentes tipos de dados, como documentos, grafos, chave-valor, entre outros.
Os bancos de dados NoSQL são frequentemente utilizados em cenários como aplicativos da web, análise de big data, IoT (Internet das Coisas) e outras situações em que a escalabilidade e a flexibilidade são fundamentais.
02. Diferenciais¶
Os diferenciais do NoSQL em comparação aos bancos de dados relacionais incluem:
-
Modelagem Flexível de Dados: Os bancos de dados NoSQL permitem a modelagem flexível de dados, incluindo a capacidade de armazenar e manipular dados sem uma estrutura rígida, possibilitando a evolução do esquema de dados de forma mais ágil.
-
Escalabilidade Horizontal: São projetados para escalabilidade horizontal, o que significa que podem lidar com grandes volumes de dados distribuindo-os em vários servidores, proporcionando capacidade de crescimento de forma mais eficiente.
-
Suporte a Diversos Modelos de Dados: Oferecem suporte a diferentes modelos de dados, como documentos, grafos, chave-valor, entre outros, atendendo a uma variedade de requisitos de aplicativos.
-
Desempenho e Velocidade: Em muitos casos, os bancos de dados NoSQL oferecem desempenho superior para operações específicas, especialmente em cenários de leitura e gravação intensivas.
-
Facilidade de Escala: Permitem escalar facilmente para atender a demandas crescentes, sem os mesmos desafios de escalabilidade enfrentados pelos bancos de dados relacionais tradicionais.
-
Suporte a Ambientes Distribuídos: São mais adequados para ambientes distribuídos e sistemas distribuídos, facilitando a replicação e a disponibilidade em vários nós.
-
Esses diferenciais tornam os bancos de dados NoSQL atraentes em cenários nos quais a flexibilidade, a escalabilidade e a capacidade de lidar com diversos tipos de dados são fundamentais.
03. Decisão por usá-lo¶
Você pode considerar usar bancos de dados NoSQL em cenários nos quais:
-
Escalabilidade: Você antecipa um grande volume de dados e precisa de uma solução que possa escalar horizontalmente de forma eficiente.
-
Modelagem Flexível de Dados: Você precisa lidar com dados semiestruturados ou não estruturados, e deseja uma solução que permita uma modelagem flexível de dados.
-
Desempenho Específico: Seu aplicativo requer operações de leitura ou gravação intensivas, nas quais os bancos de dados NoSQL podem oferecer desempenho superior em comparação com sistemas relacionais.
-
Ambientes Distribuídos: Você está construindo um sistema distribuído e precisa de suporte para replicação, tolerância a falhas e distribuição de dados em vários nós.
-
Agilidade no Desenvolvimento: Você busca uma solução que permita evoluir o esquema de dados de forma ágil, sem a necessidade de migrações complexas de esquema.
-
Diversidade de Modelos de Dados: Seu aplicativo se beneficia de suporte a diferentes modelos de dados, como documentos, grafos, chave-valor, entre outros.
-
Ao considerar esses pontos, você pode avaliar se os diferenciais oferecidos pelos bancos de dados NoSQL atendem às necessidades específicas do seu projeto.
04. Alguns exemplos de bancos de dados NoSQL incluem:¶
-
MongoDB: Um banco de dados orientado a documentos que oferece alta escalabilidade e flexibilidade na modelagem de dados.
-
Cassandra: Um banco de dados distribuído projetado para lidar com grandes volumes de dados e oferecer alta disponibilidade.
-
Redis: Um armazenamento de estrutura de dados em memória que suporta estruturas de dados complexas e é frequentemente utilizado para caching e armazenamento em tempo real.
-
Amazon DynamoDB: Um serviço de banco de dados NoSQL totalmente gerenciado oferecido pela Amazon Web Services, projetado para escalabilidade e alta disponibilidade.
-
Couchbase: Um banco de dados NoSQL que combina desempenho de memória com a escalabilidade de um banco de dados distribuído.
-
Apache HBase: Um banco de dados de código aberto que roda no topo do Hadoop Distributed File System (HDFS) e é adequado para armazenar grandes volumes de dados.
Esses são apenas alguns exemplos de bancos de dados NoSQL, cada um com suas próprias características e casos de uso específicos. Cada banco de dados NoSQL é projetado para atender a diferentes requisitos de aplicativos e cenários de uso.
05. Vamos aprofundar em cada um deles afim de sabermos para qual case são mais adequados:¶
05.1. MongoDB¶
O MongoDB é frequentemente utilizado em uma variedade de cenários, tais como:
Aplicações Web: É amplamente empregado como banco de dados principal ou complementar em aplicações web, desde pequenos sites até grandes plataformas online. Sua flexibilidade e escalabilidade o tornam adequado para diferentes tipos de aplicativos web.
Aplicações Móveis: O MongoDB é utilizado em aplicativos móveis para armazenar dados, oferecendo suporte a uma estrutura de dados flexível que se alinha bem com os requisitos de muitos aplicativos móveis.
Gerenciamento de Conteúdo: É utilizado em sistemas de gerenciamento de conteúdo (CMS) e plataformas de comércio eletrônico para armazenar e gerenciar grandes volumes de conteúdo e dados relacionados.
Análise de Dados: Muitas vezes é empregado em cenários de análise de dados, onde a capacidade de lidar com grandes volumes de dados e realizar consultas complexas é essencial.
Internet das Coisas (IoT): Em ambientes de IoT, o MongoDB é utilizado para armazenar e processar dados provenientes de dispositivos conectados, devido à sua capacidade de lidar com dados semiestruturados.
Aplicações de Jogos: É utilizado em aplicativos de jogos para armazenar dados do usuário, estatísticas do jogo e outras informações relevantes.
05.2. Cassandra¶
O Cassandra é frequentemente utilizado em cenários que envolvem:
Big Data e Análise: Devido à sua capacidade de lidar com grandes volumes de dados e oferecer escalabilidade horizontal, o Cassandra é frequentemente utilizado em cenários de big data e análise, onde a capacidade de armazenar e processar quantidades massivas de dados é essencial.
Aplicações de IoT: Em ambientes de Internet das Coisas (IoT), o Cassandra é utilizado para armazenar e processar dados provenientes de dispositivos conectados, fornecendo uma solução escalável e de alta disponibilidade para dados gerados por dispositivos IoT.
Aplicações de Tempo Real: É empregado em aplicações que exigem processamento e análise de dados em tempo real, como sistemas de monitoramento, análise de logs e aplicações de processamento de eventos.
Aplicações de Mídia Social: O Cassandra é utilizado em plataformas de mídia social para armazenar dados de perfil de usuário, relacionamentos entre usuários e outras informações relacionadas à interação social.
Aplicações de Registro e Rastreamento: É comum em aplicações que envolvem registro e rastreamento de dados, como registros de transações, logs de eventos e outros tipos de registros de alta velocidade.
05.3. Redis¶
O Redis é frequentemente utilizado em uma variedade de cenários, tais como:
Caching: É amplamente empregado como um mecanismo de cache de alto desempenho, armazenando dados frequentemente acessados em memória para acelerar o acesso a esses dados em aplicativos web e sistemas distribuídos.
Sessões de Usuário: É utilizado para armazenar e gerenciar sessões de usuário em aplicativos web, oferecendo desempenho e escalabilidade para lidar com um grande número de sessões ativas.
Fila de Mensagens: É empregado como uma fila de mensagens em sistemas distribuídos, permitindo a comunicação entre diferentes partes do sistema de forma rápida e eficiente.
Contagem de Visitas e Estatísticas em Tempo Real: É utilizado para contar e manter estatísticas em tempo real, como contagem de visitas em sites, número de curtidas em publicações, entre outros.
Aplicações de Jogos: Em aplicativos de jogos, o Redis é utilizado para armazenar dados de jogadores, informações do jogo e outras estruturas de dados adequadas para cenários de jogos em tempo real.
05.4. Amazon DynamoDB¶
O Amazon DynamoDB é frequentemente utilizado em uma variedade de cenários, tais como:
Aplicações Web e Móveis: É amplamente empregado como um banco de dados principal ou complementar em aplicações web e móveis, oferecendo escalabilidade, desempenho e baixa latência para operações de leitura e gravação.
Aplicações de IoT: Em ambientes de Internet das Coisas (IoT), o DynamoDB é utilizado para armazenar e processar dados provenientes de dispositivos conectados, fornecendo uma solução escalável e de alta disponibilidade para dados gerados por dispositivos IoT.
Gerenciamento de Sessões e Dados de Usuário: É utilizado para gerenciamento de sessões de usuário em aplicativos web, bem como para armazenamento de dados de usuário em aplicativos móveis.
Aplicações de Jogos: Em aplicativos de jogos, o DynamoDB é utilizado para armazenar dados de jogadores, estatísticas do jogo e outras informações relevantes.
Aplicações de Análise em Tempo Real: É empregado em aplicações que exigem processamento e análise de dados em tempo real, como sistemas de monitoramento, análise de logs e aplicações de processamento de eventos.
05.5. Couchbase¶
O Couchbase é frequentemente utilizado em uma variedade de cenários, tais como:
Aplicações de Tempo Real: É empregado em aplicações que exigem respostas em tempo real, como aplicativos de mensagens instantâneas, monitoramento em tempo real e processamento de transações em tempo real.
Aplicações de IoT: Em ambientes de Internet das Coisas (IoT), o Couchbase é utilizado para armazenar e processar dados provenientes de dispositivos conectados, oferecendo escalabilidade e desempenho para dados gerados por dispositivos IoT.
Aplicações de Jogos: É utilizado em aplicativos de jogos para armazenar dados de jogadores, estatísticas do jogo e outras informações relevantes, especialmente em cenários que exigem baixa latência e alta disponibilidade.
Aplicações de Mídia e Entretenimento: É utilizado em plataformas de mídia e entretenimento para armazenar e entregar conteúdo, gerenciar perfis de usuário e oferecer personalização de conteúdo de forma dinâmica.
Análise de Dados em Tempo Real: É empregado em cenários de análise de dados em tempo real, fornecendo suporte para processamento e análise de dados em tempo real em plataformas de análise em tempo real.
05.6. Apache HBase¶
O Apache HBase é um banco de dados NoSQL distribuído e escalável que é construído sobre o Apache Hadoop. Ele fornece armazenamento de dados estruturados para grandes volumes de dados e é adequado para cenários em que a escalabilidade e o desempenho são essenciais. Aqui estão alguns exemplos de casos de uso do Apache HBase:
Armazenamento de Dados Temporais:
O HBase é eficaz para armazenar dados temporais, como registros de log, dados de séries temporais e eventos em tempo real. Sua capacidade de escalabilidade horizontal permite lidar com grandes volumes de dados temporais. Sistema de Mensagens em Tempo Real:
Pode ser usado para implementar sistemas de mensagens em tempo real, onde as mensagens são armazenadas em HBase e podem ser acessadas rapidamente para suportar aplicativos de bate-papo, feeds de notícias ou sistemas de notificação. Análise de Big Data:
HBase é frequentemente utilizado em conjunto com o Apache Hadoop para suportar a análise de grandes conjuntos de dados. Ele fornece acesso rápido e aleatório aos dados, permitindo consultas eficientes em cenários de análise de big data. Armazenamento de Dados Semiestruturados:
HBase é adequado para armazenar dados semiestruturados ou não estruturados, como JSON ou XML. Isso o torna útil para casos de uso em que a estrutura dos dados pode variar. Registros de Usuários e Perfis:
Pode ser utilizado para armazenar informações de usuários e perfis em sistemas web, jogos online ou aplicativos, onde é necessário acesso rápido e eficiente aos dados do usuário. Sistema de Recomendação:
Em sistemas de recomendação, onde grandes conjuntos de dados precisam ser consultados rapidamente para fornecer recomendações personalizadas, o HBase pode ser uma escolha adequada. Monitoramento e Rastreamento:
HBase pode ser usado para armazenar dados de monitoramento e rastreamento, como logs de servidores web, informações de transações ou registros de sensores em ambientes de Internet das Coisas (IoT). Armazenamento de Dados Geoespaciais:
Em casos em que é necessário armazenar e consultar dados geoespaciais, o HBase pode ser uma escolha apropriada, especialmente quando combinado com tecnologias geoespaciais.
06. Exemplos de comandos para cada um dos bancos citados nesse documento:¶
06.1. Comandos MongoDB¶
O MongoDB é um banco de dados NoSQL orientado a documentos, e os comandos podem ser executados usando a linguagem de consulta JSON-like chamada BSON.
Inserção de Documentos: Para inserir um documento em uma coleção, você pode usar o comando insertOne ou insertMany. Aqui está um exemplo com insertOne:
db.mith.insertOne({ documento: "valor1", autor: "valor2", // ... outros campos });
Consulta de Documentos: Para consultar documentos em uma coleção, você pode usar o comando find. Aqui está um exemplo de consulta simples:
db.mith.find({ documento: "valor1" });
Atualização de Documentos: Para atualizar documentos, você pode usar o comando updateOne ou updateMany. Aqui está um exemplo com updateOne:
db.mith.updateOne( { documento: "valor1" }, { $set: { autor: "novovalor2" } } );
Remoção de Documentos: Para remover documentos, você pode usar o comando deleteOne ou deleteMany. Exemplo com deleteOne:
db.mith.deleteOne({ documento: "valor1" });
Índices: Para criar um índice em uma coleção, você pode usar o comando createIndex. Exemplo:
db.mith.createIndex({ documento: 1 });
Agregação: A agregação no MongoDB é poderosa e permite realizar operações complexas em dados. Aqui está um exemplo simples:
db.mith.aggregate([ { $match: { documento: "valor1" } }, { \(group: { _id: "\)autor", total: { $sum: 1 } } } ]);
Contagem de Documentos: Para contar o número de documentos em uma coleção que correspondem a determinados critérios, você pode usar o comando count. Exemplo:
db.mith.count({ documento: "valor1" });
06.2. Comandos Cassandra¶
O Apache Cassandra é um banco de dados NoSQL distribuído, altamente escalável e projetado para lidar com grandes volumes de dados distribuídos em vários nós.
Criação de um Keyspace: Um keyspace no Cassandra é equivalente a um banco de dados em outros sistemas de gerenciamento de banco de dados. Aqui está um exemplo de criação de um keyspace:
CREATE KEYSPACE IF NOT EXISTS magna WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};
Uso de um Keyspace: Antes de começar a trabalhar com tabelas, você precisa especificar o keyspace que deseja usar:
USE magna;
Criação de uma Tabela: Você pode criar tabelas para armazenar dados. Aqui está um exemplo de criação de uma tabela:
CREATE TABLE IF NOT EXISTS mith ( id UUID PRIMARY KEY, projeto text, autor text );
Inserção de Dados: Para inserir dados em uma tabela, você pode usar o comando INSERT:
INSERT INTO mith (id, projeto, autor) VALUES (uuid(), 'VOLT MX', 'Ary Almeida Júnior');
Consulta de Dados: Para consultar dados em uma tabela, use o comando SELECT:
SELECT * FROM mith WHERE projeto = 'VOLT MX';
Atualização de Dados: Para atualizar dados em uma tabela, use o comando UPDATE:
UPDATE mith SET autor = 'João Vitor Almeida' WHERE id = uuid();
Remoção de Dados: Para excluir dados de uma tabela, use o comando DELETE:
DELETE FROM mith WHERE id = uuid();
Criação de Índices: Índices podem ser criados para acelerar consultas em determinadas colunas. Aqui está um exemplo:
CREATE INDEX IF NOT EXISTS idx_projeto ON mith (projeto);
Consulta de Contagem: Para contar o número de linhas em uma tabela, você pode usar o comando COUNT:
SELECT COUNT(*) FROM mith;
Estes são exemplos básicos de comandos CQL. O Cassandra oferece muitos recursos avançados, como replicação de dados, consistência ajustável, e outros, que podem ser configurados conforme necessário para atender aos requisitos específicos do sistema. Certifique-se de consultar a documentação oficial do Cassandra para obter detalhes mais completos e específicos.
06.3. Comandos Redis¶
O Redis é um armazenamento de estrutura de dados em memória, frequentemente usado como banco de dados em cache, mas também capaz de suportar várias estruturas de dados, como strings, listas, conjuntos, mapas ordenados, entre outros.
Armazenar um Valor em uma Chave: Para armazenar um valor em uma chave, você pode usar o comando SET
SET minhaChave "Projeto"
Recuperar um Valor por Chave: Para recuperar o valor associado a uma chave, use o comando GET:
GET minhaChave
Armazenar em uma Lista: Para adicionar um elemento ao final de uma lista, use o comando RPUSH:
RPUSH minhaLista "autores"
Recuperar Itens de uma Lista: Para recuperar todos os itens de uma lista, use o comando LRANGE:
LRANGE minhaLista 0 -1
Armazenar em um Conjunto: Para adicionar um membro a um conjunto, use o comando SADD:
SADD meuConjunto "autor"
Recuperar Membros de um Conjunto: Para recuperar todos os membros de um conjunto, use o comando SMEMBERS:
SMEMBERS meuConjunto
Armazenar em um Mapa (Hash): Para adicionar um campo e valor a um mapa, use o comando HSET:
HSET meuMapa campo1 "latitude"
Recuperar Valor de um Campo em um Mapa: Para recuperar o valor associado a um campo em um mapa, use o comando HGET:
HGET meuMapa campo1
Expiração de Chave: Para definir um tempo de expiração para uma chave, use o comando EXPIRE:
EXPIRE minhaChave 3600 # Define expiração para 1 hora (em segundos)
Incremento Atômico: Para realizar um incremento atômico em um valor numérico associado a uma chave, use o comando INCR:
INCR minhaContagem
06.4. Comandos Amazon DynamoDB¶
O Amazon DynamoDB é um serviço de banco de dados NoSQL totalmente gerenciado pela AWS. Ele é escalável, de baixa latência e projetado para armazenar e consultar grandes volumes de dados.
Criação de uma Tabela:
Para criar uma tabela no DynamoDB, você pode usar o comando create-table:
aws dynamodb create-table \ --table-name mith \ --attribute-definitions AttributeName=ID,AttributeType=N \ --key-schema AttributeName=ID,KeyType=HASH \ --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5
Inserção de Item na Tabela: Para inserir um item em uma tabela, você pode usar o comando put-item:
aws dynamodb put-item \ --table-name mith \ --item '{"ID": {"N": "1"}, "Nome": {"S": "Exemplo"}}'
Recuperação de Item da Tabela: Para recuperar um item de uma tabela com base na chave primária, use o comando get-item:
aws dynamodb get-item \ --table-name mith \ --key '{"ID": {"N": "1"}}'
Atualização de Item na Tabela: Para atualizar um item na tabela, você pode usar o comando update-item:
aws dynamodb update-item \ --table-name mith \ --key '{"ID": {"N": "1"}}' \ --update-expression "SET Nome = :n" \ --expression-attribute-values '{":n": {"S": "Autor"}}'
Consulta na Tabela: Para realizar uma consulta em uma tabela, use o comando query. Note que você precisa especificar uma chave de índice global secundário (GSI) ou a chave primária da tabela:
aws dynamodb query \ --table-name mith \ --key-condition-expression "ID = :id" \ --expression-attribute-values '{":id": {"N": "1"}}'
Exclusão de Item na Tabela: Para excluir um item da tabela, use o comando delete-item:
aws dynamodb delete-item \ --table-name mith \ --key '{"ID": {"N": "1"}}'
06.5. Comandos Couchbase¶
O Couchbase é um banco de dados NoSQL distribuído, orientado a documentos e de alto desempenho. Ele fornece armazenamento, consulta e indexação de dados JSON.
Usando o cbq (Couchbase Query Shell) - Conectar-se ao Servidor Couchbase: Para conectar-se ao servidor Couchbase usando o cbq, você pode usar o seguinte comando:
cbq -e http://localhost:8093/ ⧉
Criar um Bucket: Para criar um bucket no Couchbase, você pode usar o comando CREATE BUCKET:
CREATE BUCKET mith WITH {"ramQuotaMB": 100, "replicaNumber": 1};
Inserir Documento: Para inserir um documento em um bucket, use o comando INSERT:
INSERT INTO mith (KEY, VALUE) VALUES ("documentos", {"projeto": "VOLT MX", "autor": "Ary Almeida Júnior"});
Consultar Documentos: Para consultar documentos em um bucket, use o comando SELECT:
SELECT * FROM mith WHERE projeto = "VOLT MX";
Usando a API RESTful - Criar um Bucket: Para criar um bucket usando a API RESTful, você pode enviar uma solicitação HTTP POST para a URL do cluster:
curl -v -X POST -u Administrator:senha \ http://localhost:8091/pools/default/buckets ⧉ \ -d name=mith -d ramQuotaMB=100 -d replicaNumber=1
Inserir Documento: Para inserir um documento usando a API RESTful, você pode enviar uma solicitação HTTP PUT para a URL do documento:
curl -v -X PUT -u Administrator:senha \ http://localhost:8091/pools/default/buckets/mith/docs/documentos ⧉ \ -d '{"projeto": "VOLT MX", "autor": "Ary Almeida Júnior"}'
Consultar Documentos: Para consultar documentos usando a API RESTful, você pode enviar uma solicitação HTTP GET para a URL do bucket com parâmetros de consulta:
curl -v -X GET -u Administrator:senha \ "http://localhost:8093/query/service?statement=SELECT ⧉ * FROM mith WH
06.6. Comandos Apache HBase¶
O Apache HBase é um banco de dados NoSQL distribuído, escalável e orientado a colunas. Ele é executado no topo do Apache Hadoop e é projetado para armazenar grandes volumes de dados em clusters distribuídos.
Iniciar o Shell do HBase:
hbase shell
Criar uma Tabela:
create 'mith', 'documentos'
Inserir Dados na Tabela:
put 'mith', 'line1', 'documentos:projeto', 'VOLT MX' put 'mith', 'line1', 'documentos:autor', 'Ary Almeida Júnior'
Recuperar Dados da Tabela:
get 'mith', 'line1'
Escanear e retornar todos os dados da Tabela:
scan 'mith'
Atualizar Dados na Tabela:
put 'mith', 'line1', 'documentos:projeto', 'Flutter Referencia'
Excluir Dados da Tabela:
delete 'mith', 'line1', 'documentos:projeto'
Desabilitar e Excluir uma Tabela:
disable 'mith' drop 'mith'
Sair do Shell do HBase:
exit
Para aprofundar ainda mais, consulte as documentações oficiais de cada produto em:¶
MongoDB - https://www.mongodb.com/docs/ ⧉
Cassandra - https://cassandra.apache.org/doc/latest/ ⧉
Redis - https://redis.io/docs/ ⧉
DynamoDB - https://docs.aws.amazon.com/pt_br/dynamodb/?id=docs_gateway ⧉
Couchbase - https://docs.couchbase.com/c-sdk/current/concept-docs/documents.html ⧉