Apresentação sobre MongoDB, seus recursos, exemplos de uso e um comparativo de performance. Apresenta modelos e comandos básicos, porém úteis, comparando-os com comandos de bancos de dados relacionais, trazendo um comparativo básico de desempenho.
2. Bacharel em Sistemas de Informação pela
Universidade Federal do Acre
Analista de Tecnologia da Informação da
Universidade Federal do Acre
Desenvolvedor em Linguagens como Clipper,
Delphi, PHP e Python
Entusiasta por Bancos de Dados e Otimização
de Consultas
3. Banco de Dados NoSQL;
Desenvolvimento iniciado em 2007 (10gen);
Primeiro Release em 2009 (MongoDB Inc.);
Escrito em C++;
Multi-Plataforma (Windows, Linux, OSX);
OpenSource;
Banco de Dados Orientado a Documentos;
4. Binários para 32 e 64 bits;
Pacotes disponíveis para várias distribuições
Linux (Red Hat, CentOS, Fedora, Debian, ...);
Utiliza Javascript como “motor” do sistema;
Documentos JSON;
É NoSQL, não OO
5. Suporte a principais tipos de dados:
String;
Double;
Inteiros;
Date;
Null;
Binary Data;
TimeStamp;
Boolean.
6. E suporte a alguns tipos especiais:
Array;
Regular Expressions;
Javascript ;
ObjectID;
Object;
Mas espere um pouco, não era OO!
7. “JSON (JavaScript Object Notation - Notação
de Objetos JavaScript) é uma formatação
leve de troca de dados.”
“JSON é em formato texto e completamente
independente de linguagem...”
Fonte: http://www.json.org/json-pt.html
8. Suporte às principais operações DML (Data
Manipulation Language):
Insert;
Update;
Delete; e
Select.
9. MongoDB é suportado pelas seguintes
linguagens:
Javascript;
C, C++, Haskell;
PHP, C#, Python, Perl, Ruby
Erlang, Scala e Java;
10. Quem usa:
CraigList;
eBay;
Foursquare;
SourceForge;
The NewYork Times;
12. Semelhança com uso do MySQL:
Conexão com o servidor;
Comando use para indicar qual database;
Sem integridade referencial (MyISAM);
Criado dinamicamente.
13. Tabelas:
No MongoDB são chamadas de Collections;
Campos:
Sem restrição no nome do campo;
14. Chamados de Documents (Documentos);
São uma estrutura JSON;
Podem ter diferentes campos em uma
mesma Collection;
15. Podem ser criados índices de ordem
ascendente ou descendente;
Podem ser criados índices compostos;
Podem ser criados índices únicos
(considerando ou ignorando nulos);
Existem chaves-primárias (por padrão são
campos nomeados por _id)
Permite índices para busca textual (text
indexes)
16. Permite consultas por quaisquer campos das
Collections;
Permite consultas em arrays (mesmo campos
do tipo array);
Permite consultas com diversos filtros,
aplicando instruções como order by, limit e
skip;
19. Tipos GeoJSON;
Cadastro de Polygons, Point’s, LineString;
Consultas baseadas em coordenadas:
União;
Intersecção; e
Proximidade.
Criação de índices para melhora das
consultas espaciais.
23. Replicação;
Cluster;
mongoimport / mongoexport;
Console Interativo de Consulta;
Servidor REST;
Ferramentas de Backup/Restore;
Monitoramento (mongotop, mongostat);
Segurança
24. Instalação/Configuração Simples
Servidor Leve;
Servidor REST;
Text Search com Multiplos Campos;
Alta Performance;
Alta Disponibilidade;
Facilmente Escalável;
Performance em consultas;
49. http://www.mongodb.org/
Site oficial do MongoDB
https://education.mongodb.com/
Site com cursos oficiais gratuitos
http://www.mongodb.org/about/production-deployments/
Lista de empresas que usam MongoDB
Editor's Notes
Boa noite a todos!
Bem, meu nome é Marcos Thomaz da Silva, sou graduado em Sistemas de Informação pela UFAC e Analista de TI da mesma universidade.
Banco de dados NoSQL, começou a ser desenvolvido pela 10gen em 2007, sendo que seu primeiro release foi em 2009. A empresa 10gen, acabou mudando de nome para MongoDB Inc. Ele foi escrito em C++, é multi plataforma, estando disponível para os sistemas operacionais Windows, Linux e OSX. É Open-Souce e orientado a documentos. De acordo com seus criadores,
“MongoDB preenche a lacuna entre modelagem chave/valor (que são bem rápidas e escaláveis) e os tradicionais bancos de dados relacionais”.
Utiliza Javascript como “motor” do sistema, ou seja, as solicitações, funções e script’s serão todos em Javascript.
Tem suporte aos principais tipos de dados.
E suporta também alguns tipos especiais como Arrays, que também existem em outros bancos de dados como por exemplo o PostgreSQL, Expressões Regulares, e outros três tipos: Javascript, ObjectID e o Object.
Foi mencionado Javascript porque pode-se armazenar funções javascript em campos, executando-as quando necessário.
ObjectID é um tipo de dados que ocupa 12 bytes e é usado para gerar chaves únicas, com base em dados do processador, hora, ID do processo e um contador randômico.
Suporta também o tipo Object. Mas espere um pouco lembram-se que eu citei qu enão era OO? O mongo utiliza documentos Json que teriam a seguinte definição...
O ObjectID é um tipo de 12 bytes onde 4 representam os segundos, 3 um identificador da máquina, 2 o ID do processo, 3 um contador (que inicia com um valor randômico) – Usado para criar campos chave-primária (espécie UUID)
Ou seja, apesar do Json servir como um tipo de orientação a objetos no javascript, e ter esse nome de object, nada mais é do que uma formatação que permite a troca (e organização ) de dados de forma mais leve que um XML. E o tipo Object no qual me referi no slide anterior é sobre esse tipo de “Objeto”, os documentos JSON.
Claro! Tudo com comandos específicos que veremos a seguir.
Vale lembrar que por ser suportado por estas linguagens, pode-se fazer uso de ferramentas destas linguagens juntamente com o MongoDB, tais como o pentaho (que é uma ferramenta de BI) e framework’s de desenvolvimento web (Rails do Ruby e Django do Python).
Diversas empresas vem utilizando e seu uso é cada vez maior. Craigslist – Empresa de Classificados Web. Foursquare – Redes social para dispositivos moveis. Dentre estas, eu gostaria de destacar a CraigList, cuja base de dados em MongoDB atualmente contém mais de 2 Bilhões de documentos, com aproximadamente 5 Tera de tamanho.
A forma de conexão com a base de dados se assemelha a conexão realizada com bancos de dados MySQL, ou seja, Conecta-se ao server e solicita-se o uso do banco de dados (através do comando use). Também não possui integridade referencial, assim como as bases MyISAM do MySQL. Um fato interessante é que o banco de dados é criado dinamicamente, ou seja, não existe a necessidade de comandos com os Create Tables ou outro do tipo.
As Tabelas no MongoDB são chamadas de Collection’s. Seguindo o mesmo caminho do banco de dados, tanto as tabelas quanto os campos são dinâmicos, ou seja, os documentos armazenados em uma mesma collection não precisam necessariamente ter os mesmos campos, a mesma estrutura. Por isso o nome de tabela não atenderia, ficando melhor definição a de coleção.
Os nomes dos campos podem conter letras e números exceto ponto e o $. Os dados armazenados são representados como JSON, mas mantém-se numa estrutura chamada de BSON, que é a representação binária, serializada, de um JSON.
No MongoDB os registros ou linhas são chamados de Documents. Como já havia mencionado, é uma estrutura JSON que contém informações. Como as linhas são chamadas de Documents, o nome de Collection ao invés de tabela mais uma vez faz sentido. Também como já foi citado, Uma mesma Colection pode conter diferentes Documents, sendo permitido que cada um tenha uma estrutura, ou seja, nomes e tipos de campos completamente diferentes um do outro. Se não for especificado uma chave primária para um registro, por padrão, é atribuído um valor do tipo ObjectID, mas pode ser de qualquer tipo.
O mongoDb permite a criação de índices, de forma semelhante ao dos SGBD’s, exceto pelo fato de que não existem índices de chave estrangeira.
Queries ou consultas, podem ser realizadas sobre quaisquer campos das collections, inclusive em campos do tipo Array e Object.
No caso do Skip, seria equivalente ao offset do postgreSQL por exemplo, usado para saltar os primeiros N registros antes de exibir os registros;
Aqui temos um exemplo simplificado de como a engine realiza as consultas no banco de dados.
Permite funções de agregação tais como Sum..... Além destas funções, é possível criar funções específicas através de funções Javascript, que podem ser rodadas diretamente no banco de dados.
Uma característica interessante é que a engine do Mongo permite a utilização de GeoJSON, que é um tipo de JSON para geolozalização. Com ele podemos especificar geometrias do tipo Polygon, Point e LIneString, além de operações como União, Intersecção e Proximidade de uma determinada geometria. Trabalha de forma semelhante ao Postgis do POstgreSQL, permitindo também a criação de índices para um melhor desempenho em operações neste formato.
Não possui o recurso de triggers ou procedures. Porém, no caso das procedures, pode ser suprida através da execução de funções javascript, que realizem operações sobre as collections de um banco de dados.
Mongoimport/export realizam a importação/exportação de formato bson para json e vice versa.
A segurança no mongoDB é um ponto importante e deve ser estudado ao se pensar em seu uso, pois por padrão, vem com a autenticação desabilitada, e a mesma deve ser ativada e configurada de acordo com a necessidade. Existem tambpem ferramentas para criptografia dos dados, o que aumenta um pouco mais a segurança.
Alguns pontos favoráveis, pelo menos que levem-nos a testar o Mongo são...
O Servidor REST permitiria que uma aplicação web, a partir de sua camada cliente, ou seja, de script’s javascript ou flash, realize consultas diretamente no banco de dados que, apesar de não recomendável, pode ser utilizado em testes.
Mas O grande motivo que me levou a testar e estudar esse banco de dados foi a Performance. Para exemplificar, foi realizado um pequeno teste
O teste foi simples, onde era realizada a inserção de alguns dados em uma base PostgreSQL, e numa base MongoDB e medido o tempo de inserção. Na mesma aplicação, era realizada a consulta de um registro aleatório, medido o tempo de resposta e avaliado.
O teste mostrou que inserção no PostgreSQL é mais rápida, porém, a recuperação é mais lenta. Ambas as bases sem índices, e foram realizadas em uma mesma máquina. O teste foi repetido 10 vezes onde o valor apresentado é o que atingiu a média.
Também vale lembrar que nenhum tipo de configuração foi realizada com nenhum dos 2 bancos de dados, ou seja, ambos estavam com suas configurações padrões.
Resolvi então incrementar um pouco mais o teste e criei um índice na base de dados POstgreSQL e resolvi executar novamente o teste de consulta, obtendo um resultado interessante: O MongoDB teve maior performance mesmo estando sem índices criados.
Claro que não é um comparativo oficial, mas ajuda a entender a diferença no desempenho.
E se ainda assim o desempenho não for suficiente, existe a possibilidade de se realizar um tratamento mais fino, avaliando as consultas com o Explain e, se for o caso indicando o melhor índice para a mesma de forma explicita (usando o hint) ou Criando novos índices que atendam as necessidades.
Outras opções seriam a criação de TableSpaces e realização de Sharding.
No Mongo não existe exatamente as tablespaces, mas sim a opção de selecionar outros discos/partições de armazenamento, que atuam de forma idêntica as tablespaces. O Sharding é um tipo de recurso que permite escalar horizontalmente, aumentando a quantidade de instâncias. É um recurso semelhante ao Particionamento de Tabelas, mas realizado com Banco de Dados inteiro.
O que eu quis demonstrar aqui foi o uso de funções javascript, dentro de comandos de agregação. Isso permite que funções de agregação possam ser muito flexíveis, apesar de, a primeira vista, parecer confuso.
De uma forma geral, eu quis apresentar para vocês uma forma diferente utilizar e gerenciar uma base de dados.
O MongoDB apesar de ser um banco de dados novo (apenas 4 anos), já vem ganhando espaço em meio a outros e se destacando pela simplicidade, quantidade de recursos e principalmente o desempenho.
Cabe salientar que temos diversos outros bancos de dados NoSQL no mercado, tais como CouchDB (OO), Redis (Key/Value), DB4O (OO), Cassandra, e muitos outros
O crescimento não só do MongoDB como dos outros bancos NoSQL, eu atribuo mais a simplicidade e facilidade de manutenção, uma tendência que pode ser vista tambem no desenvolvimento de software’s, com framework’s cada vez tendo maise mais recursos.
Assim como todas as outras ferramentas de desenvolvimento, cabe um pouco de bom senso e experiência. O ponto chave é saber exatamente o que se precisa, o que cada ferramenta tem a oferecer, para só então escolhermos uma ferramenta que nos atenda com maior precisão. Se precisar de desempenho e escalabilidade, e não precise de transações, talvez seja um bom momento para utilizá-lo, caso contrário, a sugestão é utilizar uma base relacional convencional.
Cabe também testes mais “parrudos” com um banco deste porte pois apesar de se ter notícias de uma base de aproximadamente 5TB, bases muito maiores são utilizadas, como por exemplo, uma das bases do SERPRO, com cerca de 40TB.