Você nunca pode falar sobre o chamado banco de dados "NoSQL" sem trazer o teorema do CAP (Consistência, Disponibilidade, Partição: escolha dois). Se você precisar escolher entre o MongoDB (Partição, Consistência) e o CouchDB (Disponibilidade, Partição), o primeiro que você precisará pensar é em "Preciso de dados corretos ou preciso acessar o tempo todo?".
Esses novos bancos de dados foram criados para serem particionados. Mas e se eu não fizer ? E se eu achar que é muito legal ter uma Chave / Valor, Coluna, Documento, qualquer banco de dados em vez de relacional, e apenas criar uma instância de servidor e nunca fragmentá-la? Nesse caso, eu não teria disponibilidade e consistência? O MongoDB não precisaria replicar nada, portanto estaria disponível. E o CouchDB teria apenas uma fonte de dados, portanto seria bastante consistente.
Então, isso significaria que, nesse caso, o MongoDB e o CouchDB teriam pouca diferença em termos de caso de uso? Bem, exceto, obviamente, o desempenho, API e tudo mais, mas isso seria mais como escolher entre o PostgreSQL e o MySQL do que ter dois conjuntos de requisitos fundamentalmente diferentes.
Estou bem aqui? Posso alterar um banco de dados AP ou CP para um AC, não criando mais de uma instância? Ou há algo que estou perdendo?
Vamos fazer a pergunta ao contrário. E se eu pegar um banco de dados relacional, digamos MySQL, e colocá-lo em uma configuração master / slaves. Não uso transações ACID Se eu exigir que qualquer gravação seja sincronizada com o escravo imediatamente, isso não tornaria um banco de dados do CP? E se eu sincronizá-lo em alguns intervalos predefinidos, e não importa se um cliente lê dados antigos de um escravo. Isso não tornaria um banco de dados AP? Isso não significa que, se eu desistir da conformidade com o ACID, ainda posso usar o modelo relacional para um banco de dados particionado?
Em essência: a escalabilidade sobre o que você está pronto para desistir no teorema da PAC é mais do que o modelo de dados subjacente? Ter Coluna, Documento, Valor-chave, qualquer que seja, impulsiona a escalabilidade em relação a um modelo relacional? Poderíamos projetar um banco de dados relacional projetado desde o início para tolerância à partição? (Talvez já exista). Poderíamos tornar o banco de dados NoSQL compatível com ACID?
Desculpe, são muitas perguntas, mas li muito sobre o banco de dados NoSQL recentemente e me parece que o maior benefício de usá-los é que eles se encaixam melhor na "forma" dos seus dados, em vez de apenas na partição, CAP e desistir da conformidade com o ACID. Afinal, nem todos têm tantos dados que precisam particioná-los. Existe um benefício em desempenho / escalabilidade por não usar o modelo relacional antes mesmo de pensar em particionar meus dados?