Quero um exemplo trivial de onde o MongoDB pode escalar, mas um banco de dados relacional terá problemas [fechado]


8

Estou apenas aprendendo a usar o MongoDB e, ao discutir com outros programadores, gostaria de um exemplo rápido de por que o NoSQL pode ser uma boa escolha em comparação com um RDBMS tradicional - no entanto, os cenários apresentados e os que posso encontrar online parecem bastante artificial.

Por exemplo, um blog com muito tráfego pode ser representado de forma relacional, mas exigirá algum ajuste de desempenho e junção entre tabelas (assumindo que a desnormalização completa está sendo usada). Enquanto o MongoDB permitiria a recuperação direta de uma coleção para o mesmo efeito.

Mas a resposta que recebo de outros programadores é "por que não mantê-lo relacional e depois adicionar um cache trivial mais tarde?"

Alguém tem um exemplo menos artificial em que o MongoDB realmente brilhará e um banco de dados relacional cairá muito mais rapidamente? Quanto menor o projeto / sistema, melhor, porque deixa menos espaço para desacordo.

Algo parecido com a complexidade do exemplo do blog seria realmente útil.

Obrigado.


Isso é limitado ao MongoDB ou NoSQL em geral? Eu teria um bom exemplo da pesquisa facetada do Apache Lucene que, embora não tenha idéia se isso se aplicaria ao MongoDB também.
Thorsten Müller

NoSQL em geral, suponho. Se você já tem alguns exemplos, eu adoraria vê-los.
Ryan Weir

3
MongoDB é Web Scale !!!
Wim Ombelets 28/10/2013

1
Veja mongodb-is-web-scale.com para uma explicação interessada (e um pouco NSFW); fwiw, você pode escalar qualquer coisa se abordá-la corretamente.
Wyatt Barnett

Respostas:


6

Primeiro, ele escala bem.

Quando um banco de dados MongoDB é muito freqüente ou muito grande para um único servidor, você pode adicionar mais servidores facilmente criando um cluster ou conjunto de réplicas de vários shards. Escala quase linearmente. Isso não funciona tão bem com a maioria dos bancos de dados relacionais. Dê uma olhada na lista de limitações do MySQL ao trabalhar como um cluster , por exemplo. A maioria das entradas da lista não é problema para o MongoDB (ou não se aplica).

Segundo, permite dados heterogêneos.

Imagine, por exemplo, o banco de dados do produto de uma loja de hardware de computador. Quais propriedades os produtos possuem? Todos os produtos têm um preço e um fornecedor. Mas as CPUs têm uma taxa de clock, os discos rígidos e os chips de RAM têm capacidade (e essas capacidades não são comparáveis), os monitores têm uma resolução e assim por diante. Como você projetaria isso em um banco de dados relacional? Você criaria uma tabela muito longa de productID-property-value ou criaria uma tabela de produtos muito ampla e esparsa com todas as propriedades que possa imaginar, mas a maioria delas é NULLpara a maioria dos produtos. Ambas as soluções não são realmente elegantes. Mas o MongoDB pode resolver isso muito melhor porque permite que cada documento em uma coleção tenha um conjunto diferente de propriedades.


5
'Segundo, ele permite dados heterogêneos.' Seu exemplo é perfeito. Quem não teve o horrível padrão de transformar o banco de dados em uma loja de valor-chave emergir em um sistema em que as entidades têm muitos atributos possíveis? Todo programador deve poder se relacionar imediatamente.
Ryan Weir

5
O MongoDB também tem alguns problemas de dimensionamento. Um cluster com mais de 12 nós não pode usar o mecanismo de replicação do conjunto de réplicas padrão. Você precisa voltar à configuração Master-slave. A replicação mestre-escravo apresenta problemas como nenhum failover automático na perda do mestre. Enquanto o Mysql pode lidar com centenas de nós em um cluster.
stonemetal

1
Não sei se permitir dados heterogêneos é um fator na capacidade de escalabilidade do MongoDB. Embora eu concorde que isso simplificar uma série de casos em que você está usando seu banco de dados como um armazenamento de chave / valor, que a propriedade por si só não ajuda muito em dizer isso escalas MongoDB melhor do que um RDBMS
dsw88

2
Desculpe, não havia nada na sua resposta em si. Só que o título desta pergunta é "Quero um exemplo trivial de onde o MongoDB pode ser dimensionado, mas um banco de dados relacional terá problemas". Não parece uma pergunta geral "Quando usar o NoSQL sobre RDBMS"; em vez disso, parecia direcionado exclusivamente para os recursos de escala dos dois tipos de banco de dados.
dsw88

2
@RyanWeir - concordou. Quando um banco de dados NoSQL brilha? Quando você percebe que acabou de criar um banco de dados NoSQL usando um SQL RDB como o mecanismo de armazenamento!
Carson63000

3

Algum exemplo do mundo real de um problema que eu não teria idéia de como resolver de uma maneira razoável apenas com SQL e um banco de dados relacional (talvez seja minha culpa).

Portanto, temos um banco de dados (relacional comum) com cerca de 30.000 produtos. Nada grande até agora. Cada um desses produtos possui muitos atributos. Existem os mais comuns, como grupo (cabos, antenas, capas para iphone ... cerca de 80), sortimento (de alguma forma semelhante a grupos: carro, hifi, mp3, apenas 15), marca (30).

Depois vem os dados técnicos. Cada item tem muitos itens como cor, comprimento do cabo, peso, volume. cerca de 200 tipos de valores e milhares de valores.

E o mais complicado: muitos desses produtos pertencem a algum tipo de carro (ou vários deles) ou a algum tipo de dispositivo móvel. Esses vêm em hierarquias na forma como: tipo de marca (maçã) (ipad) (1,2,3,4) e, em alguns casos, geração. (para carros é semelhante, embora em vez de geração tenhamos anos de construção)

Etapa 1 do problema:

Queremos a quantidade de produtos para cada um desses atributos. Quantos são vermelhos? Quantos estão no grupo de cabos? E assim por diante.

Isso pode ser parcialmente resolvido com o SQL. Seria um monte de consultas e bastante feio, mas acho possível. Talvez lento, mas poderíamos fazê-lo ainda mais feio e manter os contadores em cada tabela e atualizar a cada alteração. Especialmente difícil com os atributos em que um produto pode ter vários (como funciona com o iPhone e outros 12 telefones celulares)

Mas aqui vem o problema, etapa dois:

Quando um cliente seleciona um atributo (digamos que ele quer apenas ver produtos vermelhos), queremos atualizar todos esses contadores em tempo real. Isso significa que teríamos consultas extremamente complicadas (provavelmente pouco rápidas de qualquer maneira) ou manteríamos contadores para possíveis combinações de atributos (bilhões).

Quando eu comecei neste projeto, eles deram a opção de contador e tentaram fazer isso para um subconjunto muito pequeno de atributos (grupo, sortimento, marca). O código era feio, com erros e lento. Além disso, agora eles tinham uma mesa com balcões que era muito maior que a mesa de produtos.

Usar as facetas do Apache Solr foi realmente a solução. Nivele as tabelas em uma lista de documentos (um por produto) permitidos para obter todos esses dados em tempo real com consultas muito mais simples.


2

Você pode pensar a qualquer momento que achar que uma tabela EAV é a melhor maneira de fazer as coisas (notoriamente lenta em bancos de dados reais e difíceis de consultar); talvez seja necessário um banco de dados nosql. Isso é especialmente verdade quando você não tem como saber antecipadamente quais seriam os campos. Um exemplo seria armazenar os detalhes dos exames médicos. Cada novo teste pode ter dados totalmente diferentes que você precisaria armazenar. E embora você possa (em teoria) modelar testes existentes (com muito tempo e esforço, pois existem milhares deles), como você saberia de quais novos testes poderá obter resultados para testes (e talvez equipamentos médicos) que não temos ' ainda nem inventou.


1
Essa é uma boa razão, mesmo para algo tão simples quanto um gerenciador de contatos. Todo mundo quer acompanhar algo diferente. Não é grande coisa, desde que você saiba para que coluna: o Text14 é usado.
JeffO 11/02

0

Quanto menor o projeto / sistema, melhor, porque deixa menos espaço para desacordo.

Isso é difícil porque o NoSQL é melhor apenas em grandes ambientes. Entendo que você quer dizer um Exemplo Simples , e eu tenho um perfeito para você.

Suponha que você esteja criando um site de viagens e precise que os usuários viajem de e para os 5.170 aeroportos dos EUA destinados a qualquer um dos outros (mesmos) 5.170 aeroportos dos EUA ...

Mas aqui está o Kicker, nem todos os vôos são diretos, você também precisa informar ao usuário todas as opções de escala, às vezes 2 ou 3 escalas. Você também precisa informar ao usuário todas as opções em uma janela de 5 horas! E você precisa calcular isso em menos de 10 segundos enquanto o usuário estiver aguardando.

Este é o Pesadelo do banco de dados relacional ... No NoSql, as rotas de vôo geralmente são definidas com algumas semanas de antecedência, para que você possa calcular todos os Gazillions de roteadores possíveis com antecedência, do que em um simples cluster NoSql DB ...

NoSql é o vencedor claro é esse cenário.


Obrigado, eu amo esse exemplo e o utilizarei. Mas se o que você está dizendo é verdade que 'NoSQL é melhor apenas em grandes ambientes', terei de defender melhor o lado do tempo de desenvolvimento mais rápido, uma melhor prova de dimensionamento para o futuro, etc. Qualquer outra idéia ?
Ryan Weir

4
@RyanWeir As respostas a essas perguntas terão que ser específicas do aplicativo. Para ser sincero, parece que você quer vender o NoSql para a equipe porque deseja aprender o NoSql. Mas esse é um motivo inválido, então você está tentando criar outra coisa. Eu apenas diria a eles que "Vamos usar o NoSQL para que possamos aprender, é uma boa habilidade ter".
21413 Idiotas

1
Por que isso é um problema de banco de dados em primeiro lugar? Se eu tivesse que executar cálculos como esse, eu o configuraria como uma variante em A * que não para após o primeiro resultado. Puxe todos os dados de voo relevantes do banco de dados (ou eles já estejam armazenados em cache na memória), construa um gráfico ponderado de acordo com as prioridades definidas pelo usuário e relate o primeiro número X de resultados.
Mason Wheeler

@MasonWheeler não tenho certeza que você entende por "variante A *"
Morons

1
@RyanWeir: Os idiotas estão certos, realmente. O NoSQL é melhor apenas em grandes ambientes. A menos que você esteja tentando criar algo em grande escala (ou seja, Facebook, Flickr, EBay, Amazon etc.), você quase certamente não precisa disso, e as vantagens e desvantagens no tempo de desenvolvimento valem a pena quando você começa a moderar a em grande escala, que o modelo relacional lida muito bem com o hardware moderno. É quando você realmente começa a apreciar os benefícios e as garantias que o ACID e o modelo relacional trazem.
Mason Wheeler
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.