O uso de Bancos de Dados NoSQL é impraticável para grandes conjuntos de dados em que você precisa pesquisar por conteúdo?

49

Estou aprendendo sobre bancos de dados NoSQL há uma semana.

Eu realmente entendo as vantagens dos Bancos de Dados NoSQL e os muitos casos de uso para os quais eles são ótimos.

Mas muitas vezes as pessoas escrevem seus artigos como se o NoSQL pudesse substituir bancos de dados relacionais. E aí está o ponto que eu não consigo entender:

NoSQL Databases are (often) key-value stores.

É claro que é possível armazenar tudo em um armazenamento de valor-chave (codificando os dados em JSON, XML, o que for), mas o problema que vejo é que você precisa get alguma quantidade de dados que corresponde a um critério específico, em muitos casos de uso. Em um banco de dados NoSQL você tem apenas um critério que você pode pesquisar com eficiência - a chave. Bancos de dados relacionais são otimizados para procurar qualquer valor na linha de dados de forma eficaz.

Portanto, os bancos de dados NoSQL não são realmente uma opção para persistir dados que precisam ser pesquisados por seu conteúdo. Ou eu entendi mal alguma coisa?

Um exemplo:

Você precisa armazenar dados do usuário para uma loja virtual.

Em um banco de dados relacional, você armazena cada usuário como uma linha na tabela users , com um ID, o nome, o país dele, etc.

Em um banco de dados NoSQL, você armazenaria cada usuário com seu ID como chave e todos os seus dados (codificados em JSON, etc.) como valor.

Portanto, se você precisar obter todos os usuários de um país específico (por alguma razão, os responsáveis pelo marketing precisam saber algo sobre eles), é fácil fazer isso no Banco de Dados Relacional, mas não é muito eficaz no banco de dados NoSQL. você tem que pegar todo usuário, analisar todos os dados e filtrar.

Eu não digo que é impossível , mas fica muito mais complicado e acho que não é tão eficaz se você quiser pesquisar os dados das entradas do NoSQL.

Você pode criar uma chave para cada país que armazena as chaves de cada usuário que mora neste país e obter os usuários de um país específico obtendo todas as chaves que são depositadas na chave desse país. Mas eu acho que esta técnica torna um conjunto de dados complexo ainda mais complexo - é mais difícil de implementar e não tão eficaz quanto a consulta de um banco de dados SQL. Então eu acho que não é uma maneira que você usaria na produção. Ou é?

Não tenho muita certeza se entendi errado algo ou ignorei alguns conceitos ou práticas recomendadas para lidar com esses casos de uso. Talvez você possa corrigir minhas declarações e responder minhas perguntas.

    
por Leo Lindhorst 11.01.2016 / 19:01
fonte

8 respostas

39

Embora eu concorde com sua premissa de que o NoSQL não é uma panacéia para todos os problemas do banco de dados, acho que você entendeu mal um ponto importante.

In NoSQL database you have only one criterion you can search for effectively - the key.

Isso claramente não é verdade.

Por exemplo, o MongoDB suporta índices. (de link )

Indexes support the efficient execution of queries in MongoDB. Without indexes, MongoDB must perform a collection scan, i.e. scan every document in a collection, to select those documents that match the query statement. If an appropriate index exists for a query, MongoDB can use the index to limit the number of documents it must inspect.

Indexes are special data structures [1] that store a small portion of the collection’s data set in an easy to traverse form. The index stores the value of a specific field or set of fields, ordered by the value of the field. The ordering of the index entries supports efficient equality matches and range-based query operations. In addition, MongoDB can return sorted results by using the ordering in the index.

Como o couchbase (do link )

Couchbase views enable indexing and querying of data.

A view creates an index on the data according to the defined format and structure. The view consists of specific fields and information extracted from the objects in Couchbase.

Na verdade, qualquer coisa que se chame um banco de dados NoSQL em vez de um armazenamento de valor-chave deve realmente suportar algum tipo de esquema de indexação.

Na verdade, muitas vezes é a flexibilidade desses esquemas de índice que faz o NoSQL brilhar. Na minha opinião, a linguagem usada para definir os índices do NoSQL geralmente é mais expressiva ou natural que o SQL, e como eles geralmente vivem fora da tabela, você não precisa alterar os esquemas de tabela para suportá-los. (Para não dizer que você não pode fazer coisas parecidas no SQL, mas para mim parece que há muito mais saltos de aros envolvidos).

    
por 12.01.2016 / 02:02
fonte
40

De modo geral, se o seu fluxo de trabalho for uma correspondência perfeita para as consultas de banco de dados relacional, você verá os bancos de dados relacionais como a abordagem mais eficiente. É um tipo de tautológico, mas é verdade.

A alegação de que muitos defensores do NoSQL fariam é que muitos fluxos de trabalho foram realmente massageados em uma forma relacional, e teriam sido mais eficazes antes de tal massageamento. A validade desta alegação é complicada de verificar. Claramente existem trabalhos que são muito bem descritos por consultas SQL. Eu posso dizer pela minha experiência que as minhas tarefas de programação relacional em particular poderiam ter sido feitas usando o NoSQL com quase o mesmo nível de eficiência, se não mais. No entanto, essa é uma afirmação muito subjetiva baseada na experiência limitada.

Tenho a sensação de que grande parte da venda da abordagem NoSQL vem da suposição de grandes bancos de dados. Quanto maior o banco de dados, mais você deve preparar seu fluxo de trabalho para suportar os conjuntos de dados maiores. O NoSQL parece ser melhor em apoiar esse esforço de preparação. Assim, quanto maior o banco de dados, mais importante é o potencial do NoSQL.

Para usar o exemplo, a consulta SQL por país é tão lenta quanto a verificação NoSQL de todos os usuários, a menos que você tenha explicitamente informado ao SQL para indexar a tabela users por país. O NoSQL pode fazer o mesmo, onde você cria uma coleção de valores-chave ordenada que é o índice (assim como o SQL faz sob o capô) e a mantém.

A diferença? Mecanismos SQL tinham o conceito de indexar a tabela embutida. Isso significa que você precisa fazer menos trabalho (tudo que você precisa fazer é adicionar um índice à tabela). No entanto, isso também significa que você tinha menos controle. Na maioria dos casos, essa perda de controle é aceitável, em troca do mecanismo de SQL que faz o trabalho para você. No entanto, em conjuntos de dados massivos, você pode querer um modelo de consistência diferente do modelo típico do SQL ACID. Você pode querer usar o modelo BASE que suporta consistência eventual. Isso pode ser muito difícil em SQL, porque o mecanismo SQL está fazendo o trabalho para você, portanto, isso deve ser feito pelas regras do mecanismo SQL. No NoSQL, essas camadas são normalmente expostas, permitindo que você as invada.

    
por 11.01.2016 / 19:27
fonte
16

NoSQL é um termo bastante vago, uma vez que abrange basicamente todos os sistemas de banco de dados que não são relacionais.

O que você descreve é um armazenamento de valor-chave , que é um tipo de banco de dados em que um blob de dados é armazenado em uma chave e pode ser consultado rapidamente se você souber a chave. Esses bancos de dados são incrivelmente rápidos se você souber a chave exata, mas, como você mesmo diz, se precisar pesquisar ou filtrar várias propriedades nos dados, isso será lento e incômodo.

Ninguém em sã consciência afirmaria que os armazenamentos de valores-chave podem substituir bancos de dados relacionais em geral. No entanto, pode haver casos de uso específicos em que o armazenamento de valor-chave é um bom ajuste. Os armazenamentos de valores-chave são geralmente usados para armazenamento em cache, pois você normalmente armazena em cache os itens por id, mas não precisa realizar consultas ad-hoc nos caches. Por exemplo, o próprio site Stackoverflow usa Redis (um db de valor-chave) extensivamente , mas apenas para o cache de saída. Os dados canônicos subjacentes ainda são mantidos em um banco de dados relacional.

Portanto, a resposta é bastante óbvia: use um armazenamento de valor-chave se você precisar apenas armazenar e pesquisar usando uma única chave. Caso contrário, use um tipo diferente de banco de dados. E se você estiver em dúvida, use um banco de dados relacional, já que esse é o tipo de banco de dados mais versátil, enquanto os bancos de dados NoSQL são geralmente otimizados para casos de uso muito particulares.

    
por 11.01.2016 / 22:04
fonte
10

Suas asserções sobre bancos de dados relacionais são verdadeiras, até o ponto em que você tem tantos dados que você não pode mais colocar uma cópia em um único servidor. Então você começa a se deparar com todos os tipos de problemas interessantes. Como você divide suas tabelas para que a maioria das suas consultas possa ser executada em um único servidor? Quantas cópias dos dados você faz? Como você lida com inconsistências entre essas cópias? Como você mantém os dados de um usuário em um data center que é relativamente próximo a ele ou geograficamente?

Esses objetivos costumam conflitar entre si. Muitos usuários do Twitter seguem pessoas de todo o mundo. O banco de dados do Twitter deve ser geograficamente otimizado para ler tweets ou escrever tweets?

Acontece que quando você lida com esse tipo de escala, você começa a inventar soluções, adicionando redundâncias e impondo restrições que lembram muito um banco de dados NoSQL. Se você puder ajustar todos os seus dados em uma caixa, você só receberá as restrições e não precisará dos benefícios.

    
por 12.01.2016 / 00:23
fonte
5

Os bancos de dados NoSQL têm muito pouco a ver com o “ Não SQL”.

Eles admitem que você não pode ter um banco de dados em escala que seja sempre consistente e dê suporte a transações complexas e tenham durabilidade.

Em um banco de dados relacional normal, todos os índices são mantidos atualizados automaticamente dentro do escopo de uma transação, portanto, podem ser usados para qualquer consulta.

Em um banco de dados NoSQL, o programador é responsável por manter muitos dos índices e assume-se que os índices estarão sempre desatualizados.

Por exemplo:

  • Um índice de pessoas por número de imposto pode conter algumas pessoas que nunca concluem o processo de registro para impostos.
  • Por isso, o código que usa o índice deve ser capaz de lidar com o registro incompleto para impostos
  • Outra opção é ter momentos em que uma pessoa registrada para imposto não está no índice. (Portanto, seu design tem que lidar com a falta de dados consistentes e decidir como os dados não serão consistentes.)

Como um exemplo real, a Amazon prefere me mostrar a descrição desatualizada de um livro do que atrasar a exibição da página da Web esperando que 106 computadores confirmem que a trava correta foi removida.

Portanto, .....

Se um único banco de dados relacional normal puder armazenar todos os seus dados e processar cada transação com rapidez suficiente para que o bloqueio não impeça o sistema de realizar um trabalho útil, um banco de dados relacional é a melhor opção.

Mas assim que você começar a pensar em usar mais de um banco de dados relacional ou em dividir as transações para evitar erros de bloqueio, você terá que lidar com o tipo de problema que recebe ao usar o NoSQL. ”Bases de dados.

Como os bancos de dados "NoSQL" não ocultam esses problemas, eles podem se tornar a melhor opção quando você dimensiona um sistema. Mas lembre-se que o Stackoverflow ainda usa um banco de dados relacional para armazenar todos os seus dados, com uso limitado de NoSQL na camada de cache - então você tem que ser MUITO grande antes de ser forçado a usar o NoSQL para armazenar seus dados. >

    
por 12.01.2016 / 13:04
fonte
2

Relational Databases are optimized to search for any value in the datarow effectively.

Não confunda a capacidade de pesquisar em "qualquer" valor em uma linha com o valor "every" em uma linha. A maneira mais eficaz de fazer isso requer um ou mais índices. Você poderia ter índices que incluam todos os campos, mas você apenas impediu a capacidade de fazer alterações que exijam a alteração do índice (inserções, atualizações, exclusões). Você (ou seu DBA) precisa entender os dados, o uso, os gargalos, etc.

    
por 11.01.2016 / 19:31
fonte
-1

Já existem muitas respostas, mas eu só queria adicionar meu resumo.

O conceito Clearly NoSQL abrange uma variedade de abordagens diferentes na organização de dados em disco, na memória e a exposição por meio de uma linguagem de consulta (alguns são até parecidos com SQL!). A meu ver, a força vem dessa variedade de sistemas para que você possa escolher a melhor ferramenta para o trabalho. Mas ainda assim espero que você possa cobrir uma dúzia de diferentes necessidades com apenas algumas soluções diferentes, você não iria querer gerenciar uma dúzia de sistemas diferentes.

Bancos de dados relacionais podem levá-lo muito longe e são uma tecnologia comprovada, mas assim como o banco de dados, você pode escolher a linguagem de programação com base nas necessidades de cada projeto (mas também levando em conta a experiência da equipe).

    
por 12.01.2016 / 20:48
fonte
-2

Estou usando o couchdb há dois anos. É usado principalmente para gerenciamento e configuração de conteúdo.

Para relacionamentos hierárquicos são muito mais fáceis de gerenciar quando você pode visualizá-los. Para dados de leitura geral, é mais fácil editar o JSON do que gravar uma instrução UPDATE em muitos casos. Não leva um programador, na verdade, para editar o JSON. E o SQL fornece linhas e colunas, que você precisa mapear em algum tipo de estrutura de objetos.

Você também obtém um aumento de desempenho porque não está participando de 10 a 20 tabelas em consultas complexas. As exibições do Couchdb são muito rápidas porque o javascript no qual elas são baseadas não é executado no momento da consulta.

A maioria dos programadores entende Javascript, e a maioria dos programadores luta ocasionalmente com SQL.

No Couchdb, uma visão pode ser considerada como um resumo de um documento JSON. A forma como os dados da visualização são estruturados depende de você (você não está limitado pela hierarquia original).

Eu não usaria o Couchdb para dados altamente transacionais, mas para dados semi-estáticos com uma estrutura do tipo explosão de peças, é MUITO mais fácil de trabalhar do que o SQL.

Note, porém, que não há uma 'normalização' clara que possa ser aplicada (embora evitar a duplicação de dados seja um objetivo digno), e há uma estratégia de atualização essencialmente e 'otimista' semelhante ao bloqueio otimista.

    
por 12.01.2016 / 01:12
fonte