Quando alguém usaria o MongoDB (ou similar) em um DBMS relacional?

134

Estou um pouco confuso sobre toda a coisa NoSQL e tal. Quando você escolheria usar algo como MongoDB em vez de algo como Oracle ou MySQL? Eu realmente não entendo a "diferença" quanto ao uso entre eles.

Pelo que entendi, os bancos de dados do tipo NoSQL não pretendem substituir RDBMSes, mas o que exatamente eles devem fazer?

Glorfindel
fonte
O que você tem lido? Você pode fornecer citações ou links ou algum histórico para nós? Não sabemos o quanto você sabe - ou não sabe.
31511 S.Lott
3
Até / a menos que sejam movidos para cá, existem várias perguntas muito semelhantes no StackOverflow , incluindo Quando usar o MongoDB ou outros sistemas de banco de dados orientados a documentos?
Nicole
1
É em escala web mongodb-is-web-scale.com / s
Froome
3
Cinicamente: porque é uma palavra exagerada e muitas pessoas gostam de seguir hipóteses.
Sjoerd
@Pace: Eu acho que vai ser difícil vencer este post .
Robert Harvey

Respostas:

34

Eu usei o CouchDB antes em três projetos de animais de estimação.

  • Um sistema de micro blog.
  • Para salvar informações para uma pequena anotação no aplicativo que eu criei.
  • Um aplicativo de brainstorming de uso geral.

A principal razão pela qual eu escolhi isso em vez de algo como MSSQL ou MySQL é a flexibilidade que você obtém ao usá-lo. Nenhum esquema rígido. Se três meses depois da linha, você precisa de uma determinada tabela para ter um campo extra, e isso e aquilo, basta alterá-la e ela se ondula a partir daí.

Usei o Beginning CouchDB do Apress para aprender como usá-lo.

Por exemplo, o CouchDB usa o json para se comunicar de / para o banco de dados. Se seu idioma puder POST dados, você pode usá-lo para se comunicar com o banco de dados.

Leia também: Por que devo usar o banco de dados baseado em documento em vez do banco de dados relacional? no StackOverflow

Comunidade
fonte
31
Seus dois primeiros exemplos parecem um bom domínio para um DBMS relacional tradicional.
Jonas
4
@yati: Esse tipo de aplicativo soa semelhante ao StackOverflow.com e acho que funciona muito bem com um banco de dados relacional tradicional.
Jonas
4
@ yatisagade: Não estamos falando de sites sociais dinâmicos. Mas um pouco de anotações e um micro sistema de blog .
Jonas
2
Como não ter um esquema definido é uma vantagem? Com um banco de dados relacional, se três meses depois da linha você precisar de um campo extra, basta adicionar o campo. Com um banco de dados relacional, você não pode adicionar um campo dinamicamente, mas também não pode alterar o código do aplicativo dinamicamente para trabalhar com um campo adicionado dinamicamente.
Segredo
12
Essa resposta parece sugerir que o esquema de um banco de dados relacional não pode ser alterado. Eu sou incapaz de compreender a quantidade de mal-entendidos que podem levar alguém a acreditar nisso. É trivial adicionar uma nova coluna em um banco de dados relacional. Normalmente, existe uma interface do usuário agradável ou, se você preferir criar um script, isso pode ser feito em uma única instrução SQL.
JacquesB
24

Desculpe adicionar outra resposta, mas nenhuma das respostas aqui é muito satisfatória. Essa resposta é específica para o MongoDB (em oposição à grande variedade de outras opções de armazenamento de dados disponíveis, que não são bancos de dados relacionais).

Prós:

  • O MongoDB possui uma latência menor por consulta e gasta menos tempo de CPU por consulta, porque está fazendo muito menos trabalho (por exemplo, sem junções, transações). Como resultado, ele pode lidar com uma carga maior em termos de consultas por segundo e, portanto, é frequentemente usado se você tiver um número maciço de usuários.
  • O MongoDB é mais fácil de fragmentar (usar em um cluster) porque não precisa se preocupar com transações e consistência.
  • O MongoDB tem uma velocidade de gravação mais rápida, porque não precisa se preocupar com transações ou reversões (e, portanto, não precisa se preocupar com o bloqueio).
  • O MongoDB não possui um esquema , caso você tenha um caso de uso especial que possa tirar proveito disso.

Contras:

  • O MongoDB não suporta transações . É assim que ele obtém a maioria de seus benefícios.
  • Em geral, o MongoDB cria mais trabalho (por exemplo, mais custo de CPU) para o servidor cliente . Por exemplo, para unir dados, é necessário emitir várias consultas e fazer a junção no cliente.
  • Mesmo aqui em 2017, há menos suporte a ferramentas para o MongoDB do que para bancos de dados relacionais simplesmente porque é mais recente. Também há menos especialistas em MongoDB do que seus colegas relacionais.

Pontos frequentemente incompreendidos:

  • O MongoDB e os bancos de dados relacionais oferecem suporte à indexação. O desempenho da consulta é semelhante em termos de execução de consultas grandes .
  • O MongoDB não remove a necessidade de migrações ou, mais especificamente, atualizando os dados existentes à medida que o esquema evolui. Por exemplo: Se você possui um aplicativo que depende de uma tabela de usuários para conter determinados dados e modifica essa tabela para conter dados diferentes (digamos que você adicione um campo de imagem do perfil), ainda precisará:
    • Escreva seu aplicativo para manipular objetos para os quais essa propriedade é indefinida OU
    • Escreva uma migração única para inserir um valor padrão para esta propriedade OU
    • Escreva o código para fornecer um valor padrão no momento da consulta, se este campo não estiver presente OU
    • Manipule o campo ausente de alguma outra maneira
Ritmo
fonte
2
Eu acrescentaria uma coisa enorme, que de alguma forma é perdida em muitas discussões NoSQL vs RDBMS: os bancos de dados NoSQL são muito mais difíceis para consultas ad-hoc (essa é a "parte sem SQL". Isso é verdade se você é um desenvolvedor ou não. , eles também são muito mais difíceis de criar relatórios , o que é crucial para qualquer negócio sério. #
Michael Michael
Hei, eu quase chamaria isso de recurso para o MongoDB, pois desencorajo esse tipo de interação com meus bancos de dados. No entanto, o Mongo possui uma linguagem de consulta ad-hoc e um cliente ad-hoc gráfico (Compass). Não é tão rico em recursos quanto o SQL, por isso vou concordar que é uma falha em potencial, mas para mim pessoalmente, nunca fará diferença quando estiver decidindo qual banco de dados usar.
Pace
1
Por que você desencorajaria explorar os dados em seu banco de dados? Se esse banco de dados tiver alguma informação útil para a empresa, deve ser o mais acessível possível. Obviamente, embora não adicione carga à produção, é para isso que você leu as réplicas.
Michael Michael
Esta é provavelmente uma questão interessante por si só e imagino que muitas pessoas teriam pontos de vista diferentes. Pessoalmente, eu o evito porque se torna um problema de manutenção. Crio aplicativos da Web e exponho APIs REST que me comprometo a manter e otimizar para o desempenho. Já estive em situações em que não posso fazer alterações por atacado no banco de dados, pois isso quebraria muitos scripts de consulta dos engenheiros de vendas e tento evitar esse cenário agora. Por exemplo, recentemente fiz parte do meu banco de dados do PostgreSQL para o Cassandra para obter desempenho em grande escala e não precisei alterar minha API.
Pace
Eventualmente, você sempre terá partes interessadas em examinar os dados. Seja por meio de uma consulta SQL ou algum tipo de script do notebook ipython, ou via re: dash. Portanto, ao fazer alterações no banco de dados, você sempre precisará garantir que não interrompa essas dependências. O SQL (e não o RDBMS) torna os dados mais acessíveis, e isso é bom para os negócios.
Michael Michael
13

Para roubar descaradamente o Renesis (na verdade, estou fazendo esta resposta CW):


Usando RDBMSs em vez de outros tipos:

Matthew Read
fonte
4
"Os RDBMS fazem uso pesado da indexação para obter desempenho" A indexação também não é usada com o MongoDB?
Rotareti 19/10/16
Quando usar o MongoDB ou outros sistemas de banco de dados orientados a documentos? atualmente excluído no SO ... não mais .. reabriu a questão e também a protegeu. Não tenho certeza do raciocínio por trás da exclusão.
Rahul
9

Quando seus dados não são relacionais, pode haver grandes benefícios no uso de bancos de dados NoSQL, como desempenho e escalabilidade (dependendo das circunstâncias, é claro). Alguns padrões de design como o CQRS facilitam muito o aproveitamento de dados não relacionais em áreas que convencionalmente exigiriam o uso exclusivo de um banco de dados SQL.

É comum usar bancos de dados como o mongo para dados em cache. Por exemplo, se você precisar gerar um relatório, poderá fazer uma consulta SQL complicada que une e agrega um monte de dados em tempo real, ou pode apenas buscar um único documento json do banco de dados mongo que já tem tudo o que precisa para gerar o relatório. Isso torna a leitura de dados realmente fácil (e rápido!), Mas pode tornar a gravação de dados bastante complicada (é aqui que o CQRS entra).

Graeme Hill
fonte
8

Bancos de dados como o MongoDB são ótimos quando você geralmente sabe onde estão seus dados (em vez de precisar escrever várias consultas complicadas). Com o Mongo, os dados "relacionados" são aninhados nos dados pai ou possuem chaves primárias / estrangeiras. Isso é ótimo se, por exemplo, você tiver Postagens e Comentários; geralmente, você não exibirá comentários fora do contexto de uma postagem; portanto, faz sentido que os comentários sejam contidos em uma postagem (dessa forma, você obtém todos os comentários da postagem sem precisar consultar uma tabela separada).

O MongoDB não possui esquema. Isso significa que será necessário qualquer estrutura de dados que você lançar nela, na maior parte.

Por outro lado, se você precisar usar funções agregadas e sentir a necessidade de consultar dados de maneiras complexas que não podem ser alcançadas por meio de incorporações ou relações simples no Mongo, é quando você sabe que é hora de usar um RDBMS como MySQL ou PostgreSQL.

O MongoDB não pretende substituir o SQL. Ele simplesmente atende a diferentes necessidades, e o MongoDB e um RDBMS podem ser usados ​​em conjunto. Na minha opinião, o MongoDB não é tudo o que é necessário se você não precisar que seus dados sejam flexíveis ou incorporados a um documento pai. O desenvolvimento com o MongoDB é muito divertido, porque há muito menos etapas envolvidas na instalação e execução de um projeto (digamos no Rails). Precisa fazer uma alteração? Sem problemas. Basta adicionar um atributo ao seu modelo. Feito.

Não posso falar em muitos outros bancos de dados NoSQL, embora saiba que eles geralmente são projetados de maneira semelhante para atender a uma necessidade específica que não pode ser atendida por um RDBMS. Alguns residem inteiramente na memória ou podem ser fragmentados ou redimensionados com muita facilidade. Tenho certeza de que o Cassandra foi projetado para continuar operando sem perda de dados se um nó cair. O Redis é basicamente um armazenamento de valores-chave que reside na memória (com gravações periódicas em disco para persistência), mas também tem a capacidade de armazenar tipos de dados como conjuntos e classificá-los.

Ravenstine
fonte
6

A grande vitória é quando você deseja compartilhar dados ou ter bancos de dados multimestres. Você pode compartilhar dados no MySQL, mas isso se torna um grande problema. Se você estiver fazendo muitas gravações, geralmente é útil compartilhar os dados em vários servidores, o problema é que, se você deseja ter uma consistência referencial forte ao fazer isso, pode ser muito difícil, se não impossível, procurar o teorema do CAP.

Os bancos de dados SQL têm uma consistência muito boa, mas o suporte ao particionamento é muito ruim; os bancos de dados NoSQL tendem a seguir o outro caminho. Fácil de particionar, mas geralmente o que é chamado de consistência eventual. Se você estiver criando um site de mensagens aceitável, provavelmente um banco não está bem.

A vantagem é que agora existem vários modelos de como armazenar dados, para que você possa escolher como implementar as coisas, enquanto antes tudo o que você tinha eram bancos de dados SQL.

A SE Radio teve alguns bons episódios sobre esse assunto.

Zachary K
fonte
É preciso lembrar que o sharding depende fortemente da arquitetura do seu data center. Se você tem um rack de servidor, seu desempenho é incrível. Em DCs distribuídos, nem tanto. Concordou com o que você diz sobre a facilidade geral de particionar nos bancos de dados NoSql - mas a confiabilidade é uma preocupação importante.
Apoorv Khurasia
Se você faz muitas gravações, pode simplesmente ter dois modelos: um índice stronly desnormalizado lê o modelo E um modelo de gravação não indexado. Naturalmente, é necessária replicação, o que aumenta a complexidade. Você terá que avaliar o que é mais desvantajoso para você: lidar com as limitações do NoSQL, ou seja, fazer muito mais trabalho de programação para combinar registros no domínio java, ou ter a tecnologia de replicação de banco de dados existente para fazer o trabalho ou você, que custará mais em termos de configuração e hardware.
Lawrence
1

O MongoDB funciona bem quando você escreve muitos dados e quando suas necessidades de consulta não são muito complicadas. Portanto, o MongoDB é um bom ajuste quando você está implementando o CQRS com Event Sourcing no lado do Comando - ou seja, seu armazenamento de eventos é um banco de dados do MongoDB.

No lado da consulta, ainda usamos um banco de dados SQL Server com visualizações e WCF Data Services na parte superior, devido à sua flexibilidade. Acho que na maioria dos casos você realmente precisará do poder de um banco de dados relacional para consultas.

Roy Dictus
fonte
Se você escrever muitos dados, os bloqueios globais de gravação não afetarão negativamente?
Apoorv Khurasia
1
Observe que o Mongodb não usa mais um bloqueio de gravação global (e já havia sido atualizado para não exigir um quando o comentário acima foi publicado).
Jules
1

A diferença imediata e fundamental entre o MongoDB e um RDBMS é o modelo de dados subjacente. Um banco de dados relacional estrutura dados em tabelas e linhas, enquanto o MongoDB estrutura dados em coleções de documentos JSON. JSON é um formato de dados legível por humanos e autoexplicativo. Originalmente projetado para trocas leves entre navegador e servidor, tornou-se amplamente aceito para muitos tipos de aplicativos.

Os documentos JSON são particularmente úteis para gerenciamento de dados por vários motivos. Um documento JSON é composto por um conjunto de campos que são eles próprios pares de valores-chave. Isso significa que cada documento JSON carrega seu próprio design de esquema legível por humanos aonde quer que vá, permitindo que os documentos se movam facilmente entre o banco de dados e os aplicativos clientes sem perder seu significado.

JSON também é um formato de dados natural para uso na camada de aplicativo. O JSON suporta uma estrutura de dados mais rica e flexível do que as tabelas compostas de colunas e linhas. Além de suportar tipos de campos como número, sequência, booleano etc., os campos JSON podem ser matrizes ou subobjetos aninhados. Isso significa que podemos representar um conjunto de relações sofisticadas que são uma representação mais próxima dos objetos com os quais nossos aplicativos trabalham. O uso de documentos JSON em nosso banco de dados significa que não precisamos de um mapeador relacional de objetos entre nosso banco de dados e os aplicativos que ele serve. Podemos manter nossos dados da forma correta

Diwakar upadhyay
fonte
1

Se seus dados precisam de muitas consultas, uma solução NoSQL não é boa e, quando você precisa de suporte transacional (ACID), um NoSql não é o mais adequado. Acho que o NoSQL brilha quando você tem muitas leituras que precisam ser rápidas e quando a estrutura é um tanto ad-hoc, você recupera por documento ou por estrutura de página, algo assim. Porém, muitas soluções NoSQL melhoram muito rapidamente, de modo que talvez haja falhas em breve. De qualquer forma, acho que os bancos de dados relacionais ainda são um bom ajuste para a maioria dos aplicativos.

marko
fonte