As 4 principais razões pelas quais você deve usar o MongoDB
Classifique este artigo
Bem-vindo (ou bem-vindo de volta! ) à série SQL para MongoDB. Na primeira publicação desta série,mapeei termos e conceitos de SQL para MongoDB.
Também apresentei você ao Ron. Vamos parar um momento e retornar ao Ron. Ron é bastante rígido em seus hábitos. Por exemplo, ele ama sua máquina de escrever. Não importa que os computadores sejam um milhão de vezes mais poderosos do que as máquinas de escrever. Até que alguém o convença do contrário, ele continuará com sua máquina de escrever.

Talvez você não goste muito de máquinas de escrever. Mas talvez você goste de bancos de dados SQL. Você os usa há anos, aprendeu a fazê-los funcionarem bem o suficiente para você e sabe que, para aprender MongoDB, será necessário mudar sua mentalidade. O esforço realmente vale a pena?
Sim!
Nesta postagem, examinaremos os quatro principais motivos pelos quais você deve usar o MongoDB:
Você pode dimensionar de forma mais barata com o MongoDB. Por quê?
Vamos começar falando sobre o dimensionamento de bancos de dados SQL. Normalmente, os bancos de dados SQL são dimensionados verticalmente - quando um banco de dados se torna muito grande para seu servidor, ele é migrado para um servidor maior.

Alguns problemas importantes surgem com o dimensionamento vertical:
- Servidores grandes tendem a ser mais caros do que dois servidores menores com a mesma capacidade total.
- Servidores grandes podem não estar disponíveis devido a limitações de custo, limitações do provedor de nuvem ou limitações tecnológicas (pode não existir um servidor do tamanho que você precisa).
- A migração para um servidor maior pode exigir tempo de inatividade do aplicativo.
Ao usar o MongoDB, você tem a flexibilidade de dimensionar horizontalmente por meio de fragmentação. A fragmentação é um método para distribuir dados em vários servidores. Quando seu banco de dados excede a capacidade do servidor atual, você pode começar a fragmentá-lo e dividi-lo em dois servidores. À medida que seu banco de dados continua crescendo, você pode continuar adicionando mais servidores. A vantagem é que esses novos servidores não precisam ser máquinas grandes e caras — eles podem ser hardwares mais baratos e comuns. Além disso, nenhum tempo de inatividade é necessário.

Suas queries serão mais rápidas com o MongoDB. Vamos examinar o motivo.
Mesmo em nosso exemplo simples na postagem anterior em que modelamos os dados de leslie no SQL, vimos que suas informações estavam distribuídas em três tabelas. Sempre que quisermos fazer uma query para as informações de leslie, precisaremos unir três tabelas.
Nestas três tabelas pequenas, a união será muito rápida. No entanto, à medida que as tabelas crescem e nossas queries se tornam mais complexas, a união de tabelas se torna muito cara.

Lembre-se da nossa regra de ouro ao modelar dados no MongoDB: os dados que são acessados juntos devem ser armazenados juntos. Quando você segue essa regra, a maioria das queries não exigirá que você junte nenhum dado.
Continuando com nosso exemplo anterior, se quisermos recuperar as informações de Leslie do MongoDB, podemos simplesmente fazer query em um único documento na coleção
Users
. Assim, nossa query será muito rápida.À medida que nossos documentos e coleções aumentam, não precisamos nos preocupar com a lentidão das consultas, desde que usemos índices e continuemos a seguir nossa regra prática: os dados que são acessados juntos devem ser armazenados juntos.

Mudança de requisitos. Às vezes, as alterações são simples e exigem apenas alguns ajustes na interface do usuário. Mas, às vezes, as alterações se estendem até o banco de dados.
Na publicação anterior desta série, descobrimos – depois de implementar nosso aplicativo – que precisávamos armazenar informações sobre a escola de Lauren. Vamos dar uma olhada neste exemplo um pouco mais de perto.
Para adicionar uma nova coluna
school
em nosso banco de dados SQL, teremos de alterar a tabela Users
. A execução do comandoAlter Table
pode levar algumas horas, dependendo da quantidade de dados existentes na tabela. O desempenho do nosso aplicativo pode ser reduzido enquanto a tabela estiver sendo alterada, e talvez seja necessário programar um tempo de inatividade para o aplicativo.
Agora vamos examinar como podemos fazer algo semelhante no MongoDB. Quando nossos requisitos mudam e precisamos começar a armazenar o nome da escola de um usuário em um documento
User
, podemos simplesmente começar a fazer isso. Podemos escolher se e quando atualizar os documentos existentes na coleção.Se tivéssemos implementado a validação de esquema, teríamos a opção de
aplicar a validação a todas as inserções e atualizações ou apenas às inserções
e atualizações em documentos que já atendem aos requisitos do esquema. Nós
também teríamos a opção de lançar um erro ou um aviso se uma
regra de validação fosse violada.
Com o MongoDB, você pode alterar facilmente a forma de seus dados à medida que seu aplicativo evolui.

Para ser sincero, essa vantagem é uma das maiores surpresas para
mim. Achei que não importasse o que fosse usado como banco de dados de back-end: o código que interage com ele seria basicamente o mesmo. Eu
estava errado.

Os documentos do MongoDB são mapeados para estruturas de dados nas linguagens de programação mais populares. Parece uma coisa simples, mas faz uma diferença enorme ao gravar um código.
Um amigo me incentivou a testar isso, então eu testei. Implementei o código para recuperar e atualizar as informações do perfil do usuário. Meu código tem algumas simplificações para permitir que eu me concentre nas interações com o banco de dados em vez da interface do usuário. Também limitei as informações do perfil do usuário a apenas informações de contato e hobbies.
Eu escrevi o código em Python, mas, não se preocupe se você não está familiarizado com Python, vou orientá-lo passo a passo. Os conceitos serão aplicáveis independentemente da linguagem de programação escolhida.
Vamos começar com as coisas típicas do topo do arquivo. Importaremos o que precisamos, nos conectaremos ao banco de dados e declararemos nossas variáveis. Tentarei simplificar as coisas codificando o ID de usuário do usuário cujo perfil recuperaremos, em vez de extraí-lo dinamicamente do código frontend.
MySQL
1 import mysql.connector 2 3 # CONNECT TO THE DB 4 mydb = mysql.connector.connect( 5 host="localhost", 6 user="root", 7 passwd="rootroot", 8 database="CityHall" 9 ) 10 mycursor = mydb.cursor(dictionary=True) 11 12 # THE ID OF THE USER WHOSE PROFILE WE WILL BE RETRIEVING AND UPDATING 13 userId = 1
Passaremos a opção dictionary=True quando criarmos o cursor para que cada linha seja retornada como um dicionário.
MongoDB
1 import pymongo 2 from pymongo import MongoClient 3 4 # CONNECT TO THE DB 5 client = MongoClient() 6 client = pymongo.MongoClient("mongodb+srv://root:rootroot@mycluster.mongodb.net/test?retryWrites=true&w=majority") 7 db = client.CityHall 8 9 # THE ID OF THE USER WHOSE PROFILE WE WILL BE RETRIEVING AND UPDATING 10 userId = 1
Até agora, o código é praticamente o mesmo.
Agora que temos nossas conexões de banco de dados prontas, vamos usá-las para recuperar as informações do nosso perfil de usuário. Armazenaremos as informações de perfil em um dicionário Python. Os dicionários são uma estrutura de dados comum em Python e oferecem uma maneira fácil de trabalhar com seus dados.
Vamos começar implementando o código para o MySQL.
Como as informações do perfil do usuário estão espalhadas pela tabela
Users
e pela tabela Hobbies
, precisaremos uni-las em nossa query. Podemos usar declarações preparadas para garantir que nossos dados permaneçam seguros.MySQL
1 sql = "SELECT * FROM Users LEFT JOIN Hobbies ON Users.ID = Hobbies.user_id WHERE Users.id=%s" 2 values = (userId,) 3 my cursor.execute(sql, values) 4 user = mycursor.fetchone()
Quando executamos a query, um resultado é retornado para cada combinação de usuário/hobby. Quando cham amos
fetchone()
, obtemos um dicionário como o seguinte:1 {u'city': u'Pawnee', u'first_name': u'Leslie', u'last_name': u'Yepp', u'user_id': 1, u'school': None, u'longitude': -86.5366, u'cell': u'8125552344', u'latitude': 39.1703, u'hobby': u'scrapbooking', u'ID': 10}
Como juntamos as tabelas
Users
e Hobbies
, temos um resultado para cada hobby que esse usuário tem. Para recuperar todos os hobbies, precisamos iterar o cursor. Anexaremos cada hobby a um novo array hobbies
e, em seguida, adicionaremos o array hobbies
ao nosso dicionário user
.MySQL
1 hobbies = [] 2 if (user["hobby"]): 3 hobbies.append(user["hobby"]) 4 del user["hobby"] 5 del user["ID"] 6 for result in mycursor: 7 hobbies.append(result["hobby"]) 8 user["hobbies"] = hobbies
Agora vamos implementar essa mesma funcionalidade para o MongoDB.
Como armazenamos todas as informações do perfil do usuário no documento
User
, não precisamos fazer nenhuma junção. Podemos simplesmente recuperar um único documento em nossa coleção.É aqui que entra a grande vantagem de os documentos do MongoDB mapearem estruturas de dados nas linguagens de programação mais populares. Não preciso fazer nenhum trabalho para colocar meus dados em um Dicionário Python fácil de trabalhar. O MongoDB me fornece automaticamente todos os resultados em um dicionário Python.
MongoDB
1 user = db['Users'].find_one({"_id": userId})
E é isso, estamos prontos. O que nos levou 12 linhas para o MySQL, implementamos em 1 linha para MongoDB.
Nossos dicionários
user
agora são bem semelhantes em ambas as partes do código.MySQL
1 { 2 'city': 'Pawnee', 3 'first_name': 'Leslie', 4 'last_name': 'Yepp', 5 'school': None, 6 'cell': '8125552344', 7 'latitude': 39.1703, 8 'longitude': -86.5366,3 9 'hobbies': ['scrapbooking', 'eating waffles', 'working'], 10 'user_id': 1 11 }
MongoDB
1 { 2 'city': 'Pawnee', 3 'first_name': 'Leslie', 4 'last_name': 'Yepp', 5 'cell': '8125552344', 6 'location': [-86.536632, 39.170344], 7 'hobbies': ['scrapbooking', 'eating waffles', 'working'], 8 '_id': 1 9 }
Agora que recuperamos as informações do perfil do usuário, provavelmente enviaremos essas informações para o código da interface do usuário de front-end.
Quando Leslie visualiza as informações de seu perfil em nosso aplicativo, ela pode descobrir que precisa atualizá-las. O código da interface do usuário de front-end enviaria essas informações atualizadas em um dicionário Python para os arquivos Python que estamos escrevendo.
Para simular a atualização de Leslie de suas informações de perfil, atualizaremos manualmente o dicionário Python para MySQL e MongoDB.
MySQL
1 user.update( { 2 "city": "Washington, DC", 3 "latitude": 38.897760, 4 "longitude": -77.036809, 5 "hobbies": ["scrapbooking", "eating waffles", "signing bills"] 6 } )
MongoDB
1 user.update( { 2 "city": "Washington, DC", 3 "location": [-77.036809, 38.897760], 4 "hobbies": ["scrapbooking", "eating waffles", "signing bills"] 5 } )
Agora que nosso dicionário
user
está atualizado, vamos enviar as informações atualizadas para nossos bancos de dados.Vamos começar com o MySQL. Primeiro, precisamos atualizar as informações que estão armazenadas na tabela
Users
.MySQL
1 sql = "UPDATE Users SET first_name=%s, last_name=%s, cell=%s, city=%s, latitude=%s, longitude=%s, school=%s WHERE (ID=%s)" 2 values = (user["first_name"], user["last_name"], user["cell"], user["city"], user["latitude"], user["longitude"], user["school"], userId) 3 mycursor.execute(sql, values) 4 mydb.commit()
Depois, precisamos atualizar nossos hobbies. Para simplificar, excluiremos todos os hobbies existentes na tabela
Hobbies
para esse usuário e, em seguida, inseriremos os novos hobbies na tabela Hobbies
.MySQL
1 sql = "DELETE FROM Hobbies WHERE user_id=%s" 2 values = (userId,) 3 mycursor.execute(sql, values) 4 mydb.commit() 5 6 if(len(user["hobbies"]) > 0): 7 sql = "INSERT INTO Hobbies (user_id, hobby) VALUES (%s, %s)" 8 values = [] 9 for hobby in user["hobbies"]: 10 values.append((userId, hobby)) 11 mycursor.executemany(sql,values) 12 mydb.commit()
Agora vamos atualizar as informações do perfil do usuário no MongoDB. Como as informações do perfil do usuário são armazenadas em um único documento, só precisamos fazer uma única atualização. Mais uma vez, nos beneficiaremos do mapeamento de documentos do MongoDB para estruturas de dados nas linguagens de programação mais populares. Podemos enviar nosso
user
Python quando chamarmos update_one()
, o que simplifica significativamente nosso código.MongoDB
1 result = db['Users'].update_one({"_id": userId}, {"$set": user})
O que nos levou 15 linhas para MySQL, implementamos em 1 linha para MongoDB.
Neste exemplo, escrevemos 27 linhas de código para interagir com nossos dados no MySQL e 2 linhas de código para interagir com nossos dados no MongoDB. Embora
menos linhas de código nem sempre sejam um sinal de um código melhor, neste
caso, provavelmente podemos concordar que menos linhas de código levarão a uma manutenção mais fácil e menos bugs.
Os exemplos acima foram relativamente simples com queries pequenas. Imagine como seria a diferença para queries maiores e mais complexas.
O mapeamento de documentos do MongoDB para estruturas de dados nas linguagens de programação mais conhecidas pode ser uma grande vantagem em termos de tempo para escrever, depurar e manter o código.
O código acima foi escrito em Python e aproveitou o Driver Python MongoDB. Para obter uma lista completa de todas as linguagens de programação que têm drivers do MongoDB, acesse o Manual do MongoDB.
Nesta publicação, examinamos as quatro principais razões pelas quais você deve usar o MongoDB:
Não se esqueça de conferir a última publicação desta série, que abordará as três principais coisas que você precisa saber ao mudar do SQL para o MongoDB.