Pergunta

Estou interessado em ouvir sobre o projeto de estratégias que você usou com não relacionais bancos de dados "NoSQL" - isto é, o (a maior parte nova) classe de armazenamentos de dados que não usam relacional tradicional desenho ou SQL (como Hypertable, CouchDB, SimpleDB, armazenamento de dados do Google App Engine, Voldemort, Cassandra, Serviços de dados SQL, etc.). Eles também são muitas vezes referidos como "principais lojas / valor", e na base, eles agem como tabelas de hash persistente distribuídos gigantes.

Especificamente, eu quero aprender sobre as diferenças em projeto conceitual de dados com estas novas bases de dados. O que é mais fácil, o que é mais difícil, o que não pode ser feito em tudo?

  • Você vir acima com projetos alternativos que trabalho muito melhor no mundo não-relacional?

  • Você bateu sua cabeça contra qualquer coisa que parece impossível?

  • Você já preencheu a lacuna com quaisquer padrões de design, por exemplo, para traduzir de um para o outro?

  • Você mesmo fazer modelos de dados explícitos em tudo agora (por exemplo em UML) ou você atirou-los inteiramente em favor de blobs de dados semi-estruturados / orientados a documentos?

  • Você sente falta de qualquer um dos principais serviços extras que RDBMSes fornecem, como a integridade relacional, arbitrariamente suporte a transações complexas, gatilhos, etc?

Eu venho de um fundo banco de dados relacional SQL, assim que a normalização está no meu sangue. Dito isto, eu recebo as vantagens de bancos de dados não relacionais de simplicidade e de escala, e meu instinto me diz que tem que haver uma sobreposição mais rica de capacidades de design. O que você fez?

FYI, tem havido discussões StackOverflow sobre temas semelhantes aqui:

Foi útil?

Solução

Eu acho que você tem que considerar que o DBMS não relacionais diferem muito em relação à sua modelo de dados e, portanto, o projeto conceitual de dados também diferem muito. No fio Design Data em não-Bancos de Dados Relacionais do href="http://groups.google.com/group/nosql-discussion/" rel="nofollow noreferrer"> grupo os diferentes paradigmas são categorizados como esta:

  1. Bigtable-like sistemas (HBase, Hypertable, etc)
  2. lojas de valor-chave (Tóquio, Voldemort, etc)
  3. bancos de dados de documentos (CouchDB, MongoDB, etc)
  4. bancos de dados Gráfico (AllegroGraph, Neo4j, Gergelim, etc)

Eu sou mais em gráfico bancos de dados e a elegância do design de dados utilizando este paradigma foi o que me trouxe lá, cansado das deficiências do RDBMS . Eu tenho colocado alguns exemplos de design de dados usando um banco de dados gráfico neste wiki página e há uma de como modelar o básico IMDB dados do filme / ator / papel também.

Os slides da apresentação (SlideShare) Gráfico Databases eo Futuro da Grande Escala da Gestão do Conhecimento por Marko Rodriguez contém uma muito boa introdução para design de dados usando um banco de dados gráfico também.

Respondendo às perguntas específicas a partir de um ponto de vista graphdb:

O projeto alternativo:. Adicionando relações entre muitos tipos diferentes de entidades, sem qualquer preocupação ou uma necessidade de predefinir quais entidades podem se conectar

Preencher a lacuna: Eu tendem a fazer isso diferente para cada caso, com base no próprio domínio, como eu não quero um "grafo orientado a mesa" e similares. No entanto, aqui está algumas informações sobre a tradução automática de RDBMS para graphdb.

modelos explícitos de dados:. Eu faço isso o tempo todo (estilo quadro), e depois usar o modelo como é no DB bem

Miss de RDBMS mundial: maneiras fáceis de criar relatórios. Update: talvez não seja que duro para criar relatórios a partir de um banco de dados de gráfico, consulte Criando um relatório para um Neo4J Amostra banco de dados.

Outras dicas

Eu apenas comecei apenas com bancos de dados não relacionais, e eu ainda estou tentando envolver minha cabeça em torno dele e descobrir qual é o melhor modelo seria. E eu só posso falar por CouchDB.

Ainda assim, eu tenho algumas conclusões preliminares:

Você veio acima com projetos alternativos que trabalho muito melhor no mundo não-relacional?

O foco muda projeto:. O design do modelo do documento (que corresponde às tabelas DB) torna-se quase irrelevante, enquanto Tudo depende projetar os pontos de vista (o que corresponde a consultas)

O documento DB tipo de swaps as complexidades: SQL tem dados inflexíveis e consultas flexíveis, bancos de dados de documentos são o contrário

.

O modelo CouchDB é uma coleção de "documentos JSON" (basicamente tabelas de hash aninhadas). Cada documento tem uma identificação única, e pode ser trivialmente recuperado por ID. Para qualquer outra consulta, você escreve "visões", que são nomeados conjuntos de mapa / reduzir funções. Os pontos de vista retornar um conjunto de resultados como uma lista de pares de chave / valor.

O truque é que você não consultar o banco de dados no sentido de você consultar um banco de dados SQL: Os resultados da execução das funções de visualização são armazenados em um índice, e somente o índice pode ser consultado. (Como "ter tudo", "obter a chave" ou "ficar gama key").

A analogia mais próxima no mundo do SQL seria se você só poderia consultar o banco de dados usando procedimentos armazenados - a cada consulta que você deseja suporte deve ser pré-definidos.

O modelo dos documentos é extremamente flexível. Eu encontrei apenas duas restrições:

  • Mantenha os dados relacionados juntos no mesmo documento, uma vez que não há nada que corresponde a uma junção.
  • Não faça os documentos tão grande que eles estão atualizados com muita freqüência (como a colocação de todas as vendas da empresa para o ano no mesmo documento), uma vez a cada gatilhos de atualização documento a re-indexação.

Mas tudo dobradiças projetar os pontos de vista.

A alternativa projeta Eu descobri que as ordens de trabalho de magnitude melhor com CouchDB do que qualquer banco de dados SQL estão no nível do sistema em vez do nível de armazenamento. Se você tem alguns dados e quer servi-los para uma página web, a complexidade do sistema total é reduzido em pelo menos 50%:

  • há mesas concepção DB (questão menor)
  • nenhuma camada intermediária ODBC / JDBC, todas as consultas e transações sobre http (problema moderado)
  • mapeamento simples DB-to-objeto JSON, que é quase trivial em comparação com o mesmo em SQL (importante!)
  • você pode potencialmente ignorar todo o servidor de aplicativos, como você pode projetar seus documentos para ser recuperado diretamente pelo navegador usando AJAX e adicione um pouco de JavaScript polimento antes que eles são exibidos como HTML. (ENORME !!)

Para webapps normais, documento / bancos de dados baseados em JSON são uma grande vitória, e os inconvenientes de consultas menos flexíveis e algum código extra para validação de dados parece um preço pequeno a pagar.

Você bateu sua cabeça contra qualquer coisa que parece impossível?

Ainda não. Map / reduce como um meio de consulta de uma base de dados é desconhecido, e requer muito mais pensamento do que escrever SQL. Há um número relativamente pequeno de primitivas, assim que começar os resultados que você precisa é principalmente uma questão de ser criativo com como você especifica as chaves.

Há uma limitação em que as consultas não pode olhar para dois ou mais documentos ao mesmo tempo - não se junta ou outros tipos de relações multi-documentos, mas nada até agora tem sido insuperável.

Como uma limitação exemplo, contagens e somas são fáceis, mas as médias não pode ser calculado por uma visão / query CouchDB. Fix: soma retorno e contar separadamente e calcular a média no cliente

.

Você já preencheu a lacuna com quaisquer padrões de design, por exemplo, para traduzir de um para o outro?

Eu não tenho certeza que é viável. É mais de uma reformulação completa, como traduzir um programa de estilo funcional a um estilo orientado a objetos. Em geral, há muito ftipos de documentos ewer do que há tabelas SQL e mais dados em cada documento.

Uma maneira de pensar sobre isso é olhar para o seu SQL para inserções e consultas comuns: quais tabelas e colunas são atualizados quando um cliente faz um pedido, por exemplo? E quais para os relatórios de vendas mensais? Essa informação provavelmente deve ir no mesmo documento.

Isto é: Um documento da Ordem, contendo identificação do cliente e produto IDs, com campos replicados como necessário simplificar os procedimentos. Qualquer coisa dentro de um documento pode ser consultado facilmente, qualquer coisa que exige referência cruzada entre dizer Ordem e Cliente tem que ser feito pelo cliente. Então se você quer um relatório sobre as vendas por região, você provavelmente deve colocar um código de região na ordem.

Você mesmo fazer modelos de dados explícitos em tudo agora (por exemplo em UML)?

Infelizmente, nunca fez muito UML antes de bancos de dados de documentos, quer :)

Mas você precisa de algum tipo de modelo dizendo que campos pertencem em que os documentos e que tipos de valores que eles contêm. Tanto para sua própria referência mais tarde e ter certeza de que everybod usando o DB sabe as convenções. Desde que você não receber um erro se você armazenar uma data em um campo de texto, por exemplo, e qualquer pessoa pode adicionar ou remover qualquer campo eles se sentem como, você precisa de código de validação e convenções para pegar a folga. Especialmente se você trabalhar com recursos externos.

Você sente falta de qualquer um dos principais serviços extras que RDBMSes fornecer?

Não. Mas o meu fundo é web desenvolvedor do aplicativo, lidamos com bancos de dados somente na medida em que devemos :)

A empresa que eu costumava trabalhar para cometeu um produto (um webapp), que foi desenhado para correr em bancos de dados SQL de vários fornecedores, e os "serviços extras" são tão diferentes de DB de DB que eles tinham de ser implementados separadamente para cada DB. Por isso, foi menos trabalho para nós para mover a funcionalidade fora do RDBMS. Este mesmo estendido para pesquisa de texto completo.

Então, o que eu estou dando-se é algo que eu nunca tive, em primeiro lugar. Obviamente, a sua experiência pode ser diferente.


Uma ressalva: O que eu estou trabalhando agora é um webapp para dados financeiros, cotações de ações e assim por diante. Este é um jogo muito bom para um documento DB, do meu ponto de vista eu recebo todos os benefícios de um DB (persistência e consultas), sem qualquer de problemas.

mas esses dados são bastante independentes uns dos outros, não há consultas relacionais complexas. Receba as últimas citações de ticker, obter cotações de ticker e intervalo de datas, obter empresa meta-info, isso é muito bonito tudo isso. Outro exemplo que eu vi foi um aplicativo de blog e blogs não são caracterizados por esquemas de banco de dados maciçamente complicados também.

O que estou tentando dizer é que todas as aplicações bem sucedidas de bancos de dados de documentos que eu conheço de ter sido com dados que não tinha muito inter-relações em primeiro lugar: Documentos (como na pesquisa do Google), posts, artigos de notícias , dados financeiros.

Eu espero que há conjuntos de dados que mapeiam melhor para SQL do que o modelo de documento, então eu imagino SQL vai sobreviver.

Mas para aqueles de nós que querem apenas uma maneira simples de armazenar e recuperar dados - e eu suspeito que há muitos de nós -. Bases de dados de documentos (como no CouchDB) são uma dádiva de Deus

Eu estou respondendo isso com CouchDB na parte de trás da minha mente, mas eu me atreveria a maioria seria verdade para outros bancos de dados também. Olhamos para usar CouchDB, mas finalmente decidiu contra ele desde o nosso acesso aos dados não é conhecido de antemão e escalabilidade não é o problema.

Mais difícil:

  • Leva repensar em nível conceitual por isso é 'mais difícil', uma vez que é apenas diferente. Desde que você tem que saber seus padrões de acesso de dados de antecedência, sem tradução automática pode ser aplicada. Você precisa adicionar o padrão de acesso, pelo menos.
  • A coerência não é tratado pelo banco de dados, mas deve ser tratada no aplicativo. Menos garante meios de migração mais fácil, fail-over e melhor escalabilidade com o custo de uma aplicação mais complicado. O pedido tem de lidar com conflitos e inconsistências.
  • Ligações quais documentos transversais (ou chave / valor) têm de ser tratado em nível de aplicativo também.
  • tipo SQL de bancos de dados têm IDEs que são muito mais maduro. Você ganha um monte de bibliotecas de apoio (embora a estratificação dessas bibliotecas tornar as coisas muito mais complexo do que o necessário para SQL).

Mais fácil:

  • Mais rápido se você conhece seus padrões de acesso de dados.
  • Migração / Fail-over é mais fácil para o banco de dados desde há promessas são feitas para você como um programador da aplicação. Apesar de você ter consistência eventual. Provavelmente. Finalmente. Algum tempo.
  • Uma chave / valor é muito mais fácil de entender do que uma linha de uma tabela. Todos os (árvore) relações já estão em e objetos completos podem ser reconhecidos.

A modelagem deve ser sobre o mesmo, mas você tem que ter cuidado com o que você colocar em um documento:. UML também pode ser utilizado tanto para a modelagem OO, bem como modelagem DB, que são duas bestas diferentes já

Eu teria gostado de ver um bom banco de dados aberto OO bem integrado com C # / Silverlight. Só para fazer a escolha ainda mais difícil. :)

Arquivos simples ter sido considerada arcano e impraticável para um conjunto de dados de qualquer tamanho. No entanto, mais rápido computadores com mais memória tornam possível carregar um arquivo para a memória e classificá-lo em tempo real, pelo menos para razoavelmente pequeno n e, aplicativos de usuário único local.

Por exemplo, normalmente você pode ler um arquivo de 10.000 registros e classificá-lo em um campo em menos de meio segundo, um tempo de resposta aceitável.

É claro, existem razões para usar um banco de dados em vez de um arquivo simples - operações relacionais, integridade de dados, capacidade multiusuário, acccess remoto, maior capacidade, padronização, etc., mas aumentou a velocidade do computador e capacidade de memória têm feito em manipulação -Memória de dados mais práticos em alguns casos.

Os bancos de dados relacionais que vejo na vida real tendem a ser não muito bem normalizada em tudo, ao contrário do seu pedido. Quando perguntado, os designers dizem-me que é principalmente por causa do desempenho. RDBMs não são bons em se juntar, por isso mesas tendem a ser muito muito grande a partir de um ponto de normalização de vista. bancos de dados orientados a objetos tendem a ser muito melhor com isso.

Outro ponto onde RDBMs têm problemas está a lidar com chaves de história / dependentes do tempo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top