As 4 principais razões pelas quais você deve usar o MongoDB
Avalie esse Artigo
Bem-vindo (ou bem-vindo de volta): à série SQL para MongoDB. No primeiro post desta série, eu mapeei termos e conceitos de SQL para o 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 da fragmentação. A fragmentação é um método para distribuição de dados entre vários servidores. Quando seu banco de dados exceder a capacidade do servidor atual, você poderá começar a fragmentá-lo e dividi-lo em dois servidores. À medida que seu banco de dados continua a crescer, você pode continuar adicionando mais servidores. A vantagem é que esses novos servidores não precisam ser grandes e caros – 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 publicação 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 executar uma query das 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 consultar um único documento na coleção
Users
. Como resultado, 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 mudanças são simples e exigem apenas alguns ajustes na interface do usuário. Mas, às vezes, as alterações vão até o banco de dados.
Na postagem 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 nesse 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 a inserções e atualizações de documentos que já atendem aos requisitos de esquema. 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 dos seus dados à medida que o aplicativo evolui.
Para ser honesto com você, essa vantagem é uma das maiores surpresas para mim. Achei que não importava o que você usasse 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 as conexões do banco de dados prontas, vamos usá-las para recuperar as informações do perfil do usuário. Armazenaremos as informações de perfil em um Dicionário Python. Dicionários são uma estrutura de dados comum no Python e fornecem 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 seja indicativo de código melhor, nesse 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 eram 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 populares pode ser uma grande vantagem em termos de tempo para gravar, 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.