Texto básico pra quem se interessa por NoSQL: a limitação do registro

Oi gente, tudo bem?

Vejo direto por aí o pessoal comentando sobre NoSQL e tal e, numa boa? Falando muita bobagem. :slight_smile:
O interessante é que o pessoal ignora a raíz por trás dos tais problemas do modelo relacional que é justamente o seu mal uso.

Então to publicando o link abaixo para divulgar um texto, publicado em 1979 por William Kent chamado “Limitations of Record-Based Information Models”.
Trata da raíz do modelo relacional que é o registro, uma estrutura de dados que usamos diáriamente mais poucas vezes pensamos a seu respeito.

Espero que vocês gostem. :slight_smile:

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.86.4262&rep=rep1&type=pdf

Muito bom mestre! PArece ser uma boa referencia!

Antes que alguém comece com #mimimi relacional é ruim noSql é melhor: entenda, não estamos dizendo que nenhum dos dois modelos é uma bala de prata… só saber usar e quando usar.

[quote=kicolobo]Oi gente, tudo bem?

Vejo direto por aí o pessoal comentando sobre NoSQL e tal e, numa boa? Falando muita bobagem. :slight_smile:
O interessante é que o pessoal ignora a raíz por trás dos tais problemas do modelo relacional que é justamente o seu mal uso.

Então to publicando o link abaixo para divulgar um texto, publicado em 1979 por William Kent chamado “Limitations of Record-Based Information Models”.
Trata da raíz do modelo relacional que é o registro, uma estrutura de dados que usamos diáriamente mais poucas vezes pensamos a seu respeito.

Espero que vocês gostem. :slight_smile:

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.86.4262&rep=rep1&type=pdf[/quote]

Isso aí mestre, só vc não fala besteira.

Falar nisso, escreve-se “diariamente” e usa-se “mas” como conjunção adversativa :wink:

[quote=andre_salvati][quote=kicolobo]Oi gente, tudo bem?

Vejo direto por aí o pessoal comentando sobre NoSQL e tal e, numa boa? Falando muita bobagem. :slight_smile:
O interessante é que o pessoal ignora a raíz por trás dos tais problemas do modelo relacional que é justamente o seu mal uso.

Então to publicando o link abaixo para divulgar um texto, publicado em 1979 por William Kent chamado “Limitations of Record-Based Information Models”.
Trata da raíz do modelo relacional que é o registro, uma estrutura de dados que usamos diáriamente mais poucas vezes pensamos a seu respeito.

Espero que vocês gostem. :slight_smile:

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.86.4262&rep=rep1&type=pdf[/quote]

Isso aí mestre, só vc não fala besteira.

Falar nisso, escreve-se “diariamente” e usa-se “mas” como conjunção adversativa ;)[/quote]

Corretivo André Salvati,

Mil desculpas pelos erros de português.A propósito, tem algo de construtivo para adicionar a esta discussão?

Confesso que li apenas até a página 10 do pdf, que por sinal é bem interessante.
Muitas dos problemas citados ali são coisas que vemos no cotidiano mesmo.

A minha maior dúvida com relação a isso é: os bancos nosql são uma evolução nesse sentido?

O tom do texto é como o modelo relacional não é flexível o bastante.
Algumas das soluções citadas são consideradas ruins por deixarem a responsabilidade sobre os dados na aplicação e não no banco.

O que vejo porém no Nosql é justamente deixar a aplicação responsável pelo schema todo.
Ou seja, ao invés de deixar o schema mais flexível, removeu-se de vez ele da história.

Tem um vídeo interessante (e longo) sobre isso aqui: http://www.dzone.com/links/martin_fowler_on_schemalessness_nosql_and_softwar.html
Acho que 25 minutos são falando sobre os tipos de schema.

Para mim uma evolução seria partir para o que ele chama no vídeo de Predicate Schema ao invés de partir para Schemaless.

Pra mim o maior ganho que a popularização das bases de dados NoSQL trouxe foi o fato de pela primeira vez termos, de uma forma muito pública, outros modelos que podem ser postos ao lado do relacional para comparação.

Como nós estamos basicamente afogados no modelo relacional, muitas vezes não pensamos a respeito do fato de que, talvez, não seja a solução adequada para o nosso problema. O que acho maravilhoso neste texto é que ele trata da estrutura de dados mais usada no nosso dia a dia e que difícilmente nos pegamos pra pensar a respeito: o registro. A pergunta feita é: “quando uso um registro?”. Pra que ele serve? Aonde não se aplica? Quais as suas limitações?

Este tipo de questionamento, que se popularizou recentemente pra mim é o grande ganho. Você tem razão com relação à inversão da balança Abel: realmente, é isto mesmo. A gente vê a transferência de responsabilidade do SGBD pra aplicação. O objetivo disto é maior previsibilidade no custo computacional das consultas, por exemplo. Muitas vezes uma consulta sql padrão funciona muito bem por anos, mas conforme a base de dados cresce e sua estrutura vai se modificando, esta pode ir se tornando cara de repente. Afinal de contas, é um modelo declarativo: o SGBD escolhe qual algoritmo usar na consulta, e não nós. Ele vai acertar na esmagadora maioria das vezes, mas o que se percebe é que os casos nos quais isto não ocorre vão se tornando mais frequentes.

Será que NoSQL é uma evolução? Acredito que sim: mas muito mais por nos mostrar as opções.

Eu também acho que era hora de ter opções. Mas eu preferia ver algo mais poderoso e não mais simples.
Talvez um banco orientado a objetos ( que infelizmente não deu certo).
Infelizmente nem sempre o melhor produto se torna mais popular (fitas k7 e windows, por ex).

Fico preocupado quando a geração de legados nosql começar a surgir, como uma equipe nova vai dar conta de garimpar o sentido dos dados no código. (Acho que já vivemos isso antes dos relacionais).

Concordo. O que lamento é que ao invés de resolvermos a limitação do registro, nós simplesmente abrimos mão de vez.
É algo como, toma esse blob e se vira pra por o que quiser nele. (Tá, pode ser um json, mas a idéia é essa).
Enquanto isso elimina de certa forma a limitação dos registros, também elimina suas forças.
Como eu garanto que o campo dataNascimento é um date? Ou que no próximo refactoring alguém mude para dataDeNascimento e eu tenha a mesma informação em dois lugares no banco?
Eu particulamente preferia ver bancos com colunas de tipo complexo, relacionamentos polimórficos, sendo garantido contra um schema.

Eu particulamente acho isso um problema menor. Claro, todos os sistemas que trabalhei, TODOS, tinham problema de performance em banco de dados por queries mal escritas.
Mas é o tipo de coisa que você consegue analisar e alto nível, cria um índice aqui e ali, e pronto, se resolve. Sem mexer em código.

No modelo nosql você modela seu banco focado em um padrão de leitura específico.
Eu vou consultar por data… então vou fazer uma modelagem baseada em data.
Quando você quer uma query por um padrão diferente, você se ferrou. Full scan.
Acho que um antipattern que será comum em algum tempo será ler uma tabela inteira e filtrar itens na mão, um por um.
Eu, particulamente, confio mais em deixar essa otimização para quem implementa o banco de dados (focado só naquilo) do que no desenvolvedor comum que está focado em resolver o problema do negócio.

Eu estou torcendo para que seja aquele 1 passo para trás para depois dar 2 passos a frente.

[quote=kicolobo]

A propósito, tem algo de construtivo para adicionar a esta discussão?[/quote]

Já discutimos isso, ou vc esqueceu?

Eu tenho um banco com redundância e alta disponibilidade com mais 400 milhões de registros e 1TB de dados, não preciso de DBA e todas as minhas telas têm tempo de resposta na faixa de 1,5 seg. Devo muito disso ao NOSQL (BigTable do Google).

Vamos ser mais pragmáticos e parar de lero-lero.

Pragmático André Salvati,

Me lembro bem desta discussão. É aquela que, como nesta, você não contribuiu com nada positivo usando o argumento de que não prestava consultoria de graça, certo?

Bom, dado que o assunto aqui é outro e não seus performáticos sistemas, você podia ser mais útil e, ao invés de ataques tolos como suas postagens falar um pouco sobre a razão, na sua pragmática opinião, dos paradigmas nosql valerem a pena hein?

… e continuo não dando, mas quando leio BESTEIRA fica aquela aquela vontade de falar, sabe como é… :wink:

Minha contribuição já foi dada lá e aqui. Se vc acha que não, é uma questão de mero julgamento, não é fato.

Só discuto com quem tem dados e fatos e, pra isso, precisa ter experiência.

Abs. :wink:

[quote=andre_salvati][quote=kicolobo]
Me lembro bem desta discussão. É aquela que, como nesta, você não contribuiu com nada positivo usando o argumento de que não prestava consultoria de graça, certo?
[/quote]

… e continuo não dando, mas quando leio BESTEIRA fica aquela aquela vontade de falar, sabe como é… :wink:

Minha contribuição já foi dada lá e aqui. Se vc acha que não, é uma questão de mero julgamento, não é fato.

Só discuto com quem tem dados e fatos e, pra isso, precisa ter experiência.

Abs. ;)[/quote]

Experiente André Salvati,

o assunto aqui é sobre um texto que postei para que possamos discutir a respeito. É possível?

Com relação à entender e tal, entendo: se chama agressividade gratuita (e apesar de entender não concordo). Na realidade, é interessante, porque com a experiência em teoria viria também a maturidade sabe.
Dado que aqui é um fórum em que os assuntos são postados visando aprender com a experiência alheia, muito interessante esta sua postura de chegar num post com este assunto e, ao invés de enriquecer a conversa com fatos, vir aqui com meros ataques tolos. Aliás, o interessante é que até a sua participação, fatos foram expostos aqui: a começar pelo próprio texto a ser tratado não é mesmo?
Não saber que este é o objetivo do fórum é, bom: deixa pra lá. Isto foge do assunto do tópico. Então, pode nos fazer um favor? Que tal só postar sobre o que acha? Se ver alguém dizendo “bobagem” aqui, por que não tenta expor que está errado?

Você contribui muito mais calado que atuante (nas duas discussões). Seus próximos posts meramente agressivos daqui pra frente vão ser excluídos.

[quote=kicolobo]

Você contribui muito mais calado que atuante (nas duas discussões). Seus próximos posts meramente agressivos daqui pra frente vão ser excluídos.[/quote]

Acho que não, mas de novo, isso é questão de julgamento, e julgamento eu não discuto.

Na minha humilde experiência, se meus dados têm schema que não cresce, uso SQL.
Se o schema é infinito, tiro o SQL da jogada (Redis, MongoDB, Grafos, Whatever dependendo do tipo de armazenamento).

Simples assim.

[quote=andre_salvati][quote=kicolobo]

A propósito, tem algo de construtivo para adicionar a esta discussão?[/quote]

Já discutimos isso, ou vc esqueceu?

Eu tenho um banco com redundância e alta disponibilidade com mais 400 milhões de registros e 1TB de dados, não preciso de DBA e todas as minhas telas têm tempo de resposta na faixa de 1,5 seg. Devo muito disso ao NOSQL (BigTable do Google).

Vamos ser mais pragmáticos e parar de lero-lero.[/quote]

Na minha opinião esse é apenas mais 1 caso que deu certo em que outros milhares deram errado assim como no mundo SQL também existe seus casos de sucesso e suas falhas .

Não se pode comparar um buscador Google com uma rede social com um twitter com um ERP ou um blog . Um modelo não faz o outro ser melhor , nem anulam um ao outro , alias ao meu ver nem tem sentido essa bobeira de comparar um ao outro , já que a maioria de conceitos não são aplicáveis entre si ou são aplicáveis de um modo diferente . Tudo depende do que se quer fazer e de qual objetivo se quer atingir . Hoje em dia por experiencias boas e ruins utilizo o melhor dos 2 mundos ou seja EM CONJUNTO quando aplicáveis é lógico .

Um caso real pra agregar mais a discussão .

Desenvolvi uma rede social (não vem ao caso no momento qual é) em que 60% era registros básicos , 20% era buscas globais e 20% eram conexões em grafos . Na primeira semana atingi um numero alto de usuários cadastrados (isso porque estava liberado num versão beta só pra efeito de consulta de aceitação de mercado) e ai começaram os problemas já nesse começo .

Me arrependo profundamente de ter escolhido o GAE e um banco 100% NoSQL para o piloto . Deveria ter estudado melhor cada modulo e feito no modelo que melhor se aplicava e encaixava (pois sinceramente fui na onda do hype NoSQL e “achei” que não teria problema de qualquer tipo) e no meu caso o principal fator era e é ainda escalabilidade assim como garantia dos dados registrados . Alguns problemas que enfrentei :

  • Era muito imaturo na época e não tinha quase nada de recurso ainda (FullTextSearch,etc) , hoje em dia é um pouco melhor .
  • Fiquei totalmente preso a API deles em quase todas as features que precisava desenvolver . Ou seja quando pensei em migrar pra rodar em outro Cloud em varios cluster que escalava do mesmo jeito me vinha o pensamento do esforço gigantesco necessário para tal obra. Já que quase nada era compatível .
  • Pra mim foi mais complicado e menos produtivo delegar quase 100% da responsabilidade para a aplicação se preocupar .
  • Tarefas básicas que precisava realizar para fazer deploy de melhorias sempre acabava em código fonte pra rodar os map reduce e acertar ou melhorar algo no banco de dados . No mundo SQL com meia duzia de comandos eu faria a mesma coisa em muito menos tempo .

Hoje remontando e revendo e migrando aos poucos estou utilizando 3 modelos de banco de dados diferentes para um mesmo sistema . SQL e NoSQL chave-valor e grafos para as buscas e ligações da rede . Se amanha começar a trabalhar com alguma funcionalidade que envolva documentos já precisaria de outro modelo .

Um sistema nunca vai dar certo porque voce escolheu um banco de dados NoSQL X , se alguem pensa assim eu acho que esta se iludindo . Ele da certo porque o seu sistema e seu modelo de dados deve ser compatível em maior parte ou todo com um modelo NoSQL .

Fica ai meus 0,50 centavos de contribuição e vou enviar a fatura relativa a minha consultoria pro ABREU .

Oi boneazul,

fascinante o seu relato. De fato, acho que você chegou naquele momento “pós-hype”.
O que me assusta bastante no hype NoSQL é que não vejo muita preocupação com o que vai rolar a médio e longo prazo. Questões como vendor lock-in, roadmap das soluções, qualidade real dos sitemas raríssimas vezes vejo ser tratadas.

O grande ganho pra mim, como já disse, é o fato de que agora nós podemos ver de forma clara aonde cada modelo se encaixa e, o mais importante, podemos ver aonde o modelo relacional, até então usado pra tudo não deve ser usado. Como exemplo de não uso, está uma rede social que vi ser implementada que era 100% baseada em MySQL sob o argumento de que “no Facebook é assim”, ignorando completamente os problemas que o próprio Facebook enfrentou por causa disto e que acabou migrando para outras soluções, como por exemplo o Cassandra. É interessante que eu começo a ver o hype invertido: usar NoSQL pra tudo quando a solução relacional (o bom uso do registro) se mostra mais interessante.

Extrema verdade. Estamos afogados no modelo relacional. Eu mesmo admito que sempre ao pensar em uma solução, penso no modelo relacional. Pensar fora da caixa é dificil, mas é preciso!

[quote=andre_salvati]Isso aí mestre, só vc não fala besteira.

Falar nisso, escreve-se “diariamente” e usa-se “mas” como conjunção adversativa [/quote]

Desculpe pelo flame, mas, CARAMBA, toda discussão que o andre_salvati entra ele bota flame e quer por que quer arrumar problema…

[quote=AbelBueno]Confesso que li apenas até a página 10 do pdf, que por sinal é bem interessante.
Muitas dos problemas citados ali são coisas que vemos no cotidiano mesmo.

A minha maior dúvida com relação a isso é: os bancos nosql são uma evolução nesse sentido?

O tom do texto é como o modelo relacional não é flexível o bastante.
Algumas das soluções citadas são consideradas ruins por deixarem a responsabilidade sobre os dados na aplicação e não no banco.

O que vejo porém no Nosql é justamente deixar a aplicação responsável pelo schema todo.
Ou seja, ao invés de deixar o schema mais flexível, removeu-se de vez ele da história.

Tem um vídeo interessante (e longo) sobre isso aqui: http://www.dzone.com/links/martin_fowler_on_schemalessness_nosql_and_softwar.html
Acho que 25 minutos são falando sobre os tipos de schema.

Para mim uma evolução seria partir para o que ele chama no vídeo de Predicate Schema ao invés de partir para Schemaless.[/quote]

Schema definido pela aplicação != schemaless

[quote=Jaba]

Desculpe pelo flame, mas, CARAMBA, toda discussão que o andre_salvati entra ele bota flame e quer por que quer arrumar problema…[/quote]

Achismo e julgamento??? Olha meu histórico antes de falar BESTEIRA… :wink:

[quote=AbelBueno]
Fico preocupado quando a geração de legados nosql começar a surgir, como uma equipe nova vai dar conta de garimpar o sentido dos dados no código. (Acho que já vivemos isso antes dos relacionais). [/quote]

É mais fácil entender o sentido dos dados quando ele está próximo de onde vai ser usado.

[quote=AbelBueno]
O que lamento é que ao invés de resolvermos a limitação do registro, nós simplesmente abrimos mão de vez.
É algo como, toma esse blob e se vira pra por o que quiser nele. (Tá, pode ser um json, mas a idéia é essa).
Enquanto isso elimina de certa forma a limitação dos registros, também elimina suas forças.[/quote]

A força do banco de dados relacional está na sua arquitetura monolítica responsável por armazenar dados, executar queries e garantir o ACID, e não no fato do modelo de informação ser baseado em registros.

[quote=AbelBueno]
Como eu garanto que o campo dataNascimento é um date? Ou que no próximo refactoring alguém mude para dataDeNascimento e eu tenha a mesma informação em dois lugares no banco?
Eu particulamente preferia ver bancos com colunas de tipo complexo, relacionamentos polimórficos, sendo garantido contra um schema.[/quote]

Da mesma forma. Como falei anteriormente, nosql não é sem schema.

Sim, criar um indíce aqui e acolá funciona em alguns casos como paleativo, mas não resolve o problema de gargalos ocasionados pela arquitetura monolítica dos atuais banco de dados relacionais.

Se sua aplicação consulta por datas porque modelar o banco diferente de como ele vai ser usado?

A menos que consultas e transações seja considerado problema da aplicação, e não do banco de dados.

Já que facilidade é algo bem subjetivo, digamos que eu prefiro ter metadados descrevendo os relacionamentos, do que compor a visão geral dos dados a partir do seu uso no código, que pode estar espalhado entre ifs, fors, métodos, etc.

O banco relacional usa a estrutura de registro para definir o schema, que é justamente o que estou defendendo nele (o schema).

Você realmente disse anteriomente, mas não explicou a diferença.
É possível dizer que o termo schemaless em si é inexato, que na verdade o schema é implícito (e está na aplicação), mas é esse o termo usado para nosql.
Como então é diferente ?

Não é paliativo. Em muitos casos a falta de índice é o problema.
Para 400 milhões de registros essa abordagem possa falhar, mas isso não é a realidade da maioria das aplicações.

[quote=msato]
Se sua aplicação consulta por datas porque modelar o banco diferente de como ele vai ser usado?[/quote]
Por que os requisitos mudam? Por que muitas vezes é necessários queries pontuais?
Por que vou limitar minha aplicação a um padrão antes disso virar uma necessidade (como escalabilidade) ?

[quote=msato]
A menos que consultas e transações seja considerado problema da aplicação, e não do banco de dados.[/quote]
O que é justamente meu ponto, você atribui mais trabalho ao desenvolvedor da aplicação.