Pergunta

Muitos "BAW"s (bunda grande-sites estão usando armazenamento e recuperação de dados técnicas que dependem de enormes tabelas com os índices, e usando consultas que não/não pode usar Associações em suas consultas (BigTable, HQL, etc.) para lidar com a escalabilidade e a fragmentação de bases de dados.Como é que isso funciona quando você tem muitos e muitos dados que é muito relacionados?

Eu só posso especular que muito de esta adesão tem que ser feito no lado do aplicativo de coisas, mas não que começam a ficar caro?Se você tiver que fazer várias consultas a várias tabelas diferentes para obter informações para compilar?Não é bater o banco de dados que muitas vezes começando a ficar mais caro do que apenas usando junta-se, em primeiro lugar?Eu acho que depende da quantidade de dados que você tem?

E comumente disponível Realiza, como eles tendem a lidar com a incapacidade de utilizar associações?Há suporte para este Realiza em que estão em uso pesado hoje?Ou fazer a maioria dos projetos que tem para a abordagem a esse nível de dados tendem a rolar suas próprias de qualquer maneira?

Portanto, este não é aplicável a qualquer projeto atual eu estou fazendo, mas é algo que está na minha cabeça há vários meses que eu só posso especular que as "melhores práticas" são.Eu nunca tive uma necessidade para resolver isso em qualquer um dos meus projetos, porque eles nunca chegou a uma escala onde ele é necessário.Espero que esta pergunta ajuda outras pessoas também..

Como alguém disse abaixo, Realiza "não funcionam" sem associações.Existem outras camadas de acesso a dados que já estão disponíveis para desenvolvedores que trabalham com dados a este nível?

EDITAR: Para alguns esclarecimentos, Vinko Vrsalovic disse:

"Eu acredito que snicker é quer falar sobre a NÃO-SQL, onde transacional de dados é desordenado e usado no Hadoop ou BigTable ou esquemas de Cassandra."

Este é realmente o que eu estou falando.

Pontos de bônus para aqueles que pegar o xkcd de referência.

Foi útil?

Solução

A maneira que eu olhar para ele, um banco de dados relacional é uma ferramenta de propósito geral para proteger suas apostas.Computadores modernos são rápidos o suficiente, e RDBMS " são bem otimizado suficiente para que você possa crescer bastante respeitável tamanho em uma única caixa.Escolhendo um RDBMS, você está dando a si mesmo muito a flexibilidade de acesso aos seus dados, e a capacidade de ter fortes correção restrições que tornam muito mais fácil o código base de dados.No entanto, o RDBMS não vai representar uma boa otimização para um determinado problema, ele apenas dá a você a flexibilidade para mudar os problemas facilmente.

Se você começar a crescer rapidamente e percebe que você está indo ter que fazer escala para além do tamanho de um único servidor de banco de dados, de repente, você tem muito mais escolhas a fazer.Você vai precisar para começar a identificar gargalos e removê-los.O RDBMS vai ser uma desagradável rosnou nó de co-dependência que você vai ter de destrinçar.O mais interligado seus dados, mais trabalho você vai ter que fazer, mas talvez você não tenha que separar completamente a coisa toda.Se você está a ler-pesado, talvez você possa começar com a simples replicação.Se você está saturando o mercado e o crescimento é de se nivelar talvez você pode parcialmente desnormalizar e caco para número fixo de DB servidores.Talvez você só tem um punhado de problema tabelas que podem ser movidas para uma mais escalável de armazenamento de dados.Talvez o seu perfil de uso é muito cache amigável e você só pode migrar a carga de um gigante memcached cluster.

Onde escalável chave-valor lojas como a BigTable vir é quando nenhuma das opções acima, pode-se trabalhar, e você tem tanto dados de um único tipo que mesmo quando está desordenado uma única tabela é demais para um servidor.Neste ponto, você precisa ser capaz de partição arbitrariamente e ainda ter um limpo API para acesso a ela.Naturalmente, quando os dados são distribuídos por toda a tantas máquinas que você não pode ter algoritmos que requerem estas máquinas falar muito um com o outro, que muitos dos algoritmos relacionais padrão exigiria.Como você sugere, estes distribuídos consultar algoritmos têm o potencial de necessitar de mais capacidade de processamento do que o equivalente a PARTICIPAR de uma indexado de banco de dados relacional, mas porque eles são paralelizados o desempenho em tempo real é ordens de magnitude melhor que qualquer máquina só poderia fazer (supondo que uma máquina que poderia segurar o índice inteiro, ainda existe).

Agora uma vez que você pode escalar a sua enorme conjunto de dados horizontalmente (basta ligar mais servidores), a parte mais difícil de escalabilidade é feito.Bem, eu não deveria dizer feito, porque as operações em curso e de desenvolvimento a esta escala são muito mais difícil do que a de um único servidor de aplicativo, mas o ponto é que os servidores de aplicativos são normalmente trivial escala através de um compartilhamento de nada arquitetura contanto que eles podem obter os dados de que necessita em tempo hábil.

Para responder a sua pergunta sobre como comumente utilizado Realiza lidar com a incapacidade de utilizar Associações, a resposta curta é eles não.ORM está para Mapeamento Objeto Relacional, e a maioria do trabalho de um ORM é apenas traduzir o poderoso paradigma relacional do predicado lógica simples, orientada a objetos, estruturas de dados.Mais do que o valor que eles dão a você simplesmente não vai ser possível a partir de um armazenamento de chave-valor.Na prática, provavelmente você vai precisar para construir e manter sua própria camada de acesso a dados que é adequado às suas necessidades específicas, por causa de dados de perfis estas escalas estão indo para variar drasticamente e eu acredito que há muitas vantagens e desvantagens de uma ferramenta de propósito geral para emergir e tornar-se dominante a forma RDBMSs ter.Em suma, você sempre vai ter que fazer mais do que outras a esta escala.

O que disse, certamente será interessante ver que tipo de relacional ou outra funcionalidade agregada pode ser construído em cima do armazenamento de chave-valor primitivos.Eu realmente não tenho experiência suficiente aqui para comentar especificamente, mas há um monte de conhecimento na computação empresarial sobre este caminho de volta muitos anos (ex.Oracle), muito inexplorado conhecimento teórico, na academia, um monte de conhecimento prático no Google, Amazon, Facebook, et al, mas o conhecimento que tem filtrados com o resto da comunidade de desenvolvimento ainda é bastante limitado.

No entanto, agora que um monte de aplicativos estão se movendo para a web, e mais e mais da população mundial está online, inevitavelmente, mais e mais aplicações terão de escala e melhores práticas para começar a cristalizar.A lacuna de conhecimento será reduzido a partir de ambos os lados por serviços de nuvem como o AppEngine e EC2, bem como abrir bases de dados de origem, como Cassandra.Em certo sentido, este passa de mão em mão com a paralela, assíncrona e de computação, que também está em sua infância.Definitivamente uma época fascinante para ser um programador.

Outras dicas

Você está começando a partir de um circuito de assunção.

O armazenamento de dados não normalizar os dados da mesma forma que uma transação de aplicação normaliza.Não há "muitos" da une.Há relativamente poucos.

Em particular, segunda e terceira Forma Normal violações não são um "problema", desde armazéns de dados raramente são atualizados.E quando eles são atualizados, é geralmente apenas um sinalizador de status mudança para fazer uma dimensão linhas como "atual" vs."não corrente".

Desde que você não tenha de se preocupar com atualizações, você não decompor as coisas para o 2NF nível em que uma atualização não pode levar a anomalias relacionamentos.Actualizações não significa ausência de anomalias;e não se decompõe e não se junta.Você pode pré-junte-se a tudo.

Geralmente, DW dados é decomposto de acordo com um esquema em estrela.Este guia para decompor os dados numéricos "fato" tabelas que contêm as medidas -- números com unidades e referências de chave estrangeira para a dimensão.

Uma dimensão (ou "empresa") é pensada como um mundo real coisa com atributos.Muitas vezes, isso inclui coisas como a geografia, tempo, produto, cliente, etc.Essas coisas, muitas vezes, têm hierarquias complexas.As hierarquias são geralmente arbitrária, definida pelos diversos negócios, as necessidades de informação, e não modelado como tabelas separadas, mas simplesmente colunas na dimensão utilizada para a agregação.


Para abordar algumas das suas perguntas.

"esta adesão tem que ser feito no lado do aplicativo de coisas".Tipo de.Os dados são "pré-associado" antes de ser carregado.A dimensão de dados é, muitas vezes, uma associação de relevante fonte de dados sobre essa dimensão.Ele é acompanhado e carregado como um relativamente estrutura plana.

Ele não está atualizada.Em vez de atualizações, outros registros históricos estão inseridos.

"mas não que começam a ficar caro?".Tipo de.É preciso alguns cuidados para obter os dados carregados.No entanto, não há um monte de relatórios/análises de associações.Os dados são pré-associado.

O ORM questões são amplamente discutível, pois os dados são pré-associado.Seu ORM mapas para o fato ou dimensão, conforme apropriado.Exceto em casos especiais, dimensões tendem a ser pequenas-ish e caber inteiramente na memória.A exceção é quando você está em Finanças (Bancárias ou de Seguros) ou serviços de utilidade Pública e têm grandes bases de dados de clientes.Estes dimensão cliente raramente se encaixa na memória.

Um JOIN é um puro relacional prazo e não todos os bancos de dados relacionais.

Outros modelos de banco de dados tem outras maneiras de construir relações.

Bases de dados de rede use o intermináveis cadeias de find a key - fetch the reference - find a key o que deve ser programado com uma linguagem de programação comuns.

O código pode ser executado no lado do aplicativo ou no lado do servidor, mas não é SQL e nem mesmo o conjunto de base.

Se projetado corretamente, um banco de dados de rede pode ser muito mais rápido do que um banco de um.

Por exemplo, uma rede de banco de dados pode armazenar uma referência para outra entidade como um ponteiro direto para um deslocamento em um arquivo ou mesmo um bloco em um disco onde as informações sobre esta entidade é armazenado.

Isso faz atravessar as redes extra, fast — se você escreveu um código eficiente para fazer isso.

Um banco de dados relacional, só pode armazenar referências como pares de valores básicos, como números inteiros (ou triplos ou tuplas de ordem superior).

Para encontrar os valores no banco de dados relacional, o motor deve fazer as seguintes coisas:

  • Descubra onde a tupla contém o primeiro valor reside
  • Encontrar o segundo valor
  • Localizar o endereço de raiz em um B-Tree mantendo os dados que o segundo número refere-se a
  • Atravessar esta árvore
  • Encontrar o ponteiro para a tabela real (que pode ser armazenado como um B-Tree em si, caso em que o ponteiro é o valor do PRIMARY KEY da linha estamos atrás)
  • Encontrar a tabela da linha pelo ponteiro ou atravessar a tabela
  • Finalmente, obter o resultado.

E você pode controlar isso só até certo ponto.Depois do que, você acabou de emitir o SQL consulta e esperar.

Modelo relacional para simplificar a vida do desenvolvedor, não para alcançar a super velocidade de sempre e não importa o que.

Esta é a mesma montagem vs.linguagens de alto nível, modelo relacional, sendo um de nível superior língua.

Você pode querer ler o artigo no meu blog

, em que eu tento explicar as diferenças entre comumente utilizados vários modelos de banco de dados.

Quando você denormalise seus dados desta forma, você fazer isso para evitar o custo de se juntar diferentes itens;você aceita que alguns dados podem ser duplicadas e que certas formas de combinar isso pode ser difícil, para o benefício de desempenho do uso de consultas simples.

Se você está tendo de fazer qualquer grande quantidade de ingressar no nível de aplicação, isso significa que você ainda não denormalised é suficiente.

Idealmente, você vai ser capaz de fazer uma consulta para qualquer conjunto de dados que você deseja.Na prática, você não deve ter que usar mais do que duas ou três consultas para qualquer aspecto de sua aplicação, e qualquer aplicação-nível de adesão vai ser mais um trivial de obtenção de material de separar conjuntos de resultados para a inserção no modo de exibição.

Esse tipo de coisa só é realmente necessário para realmente grandes conjuntos de dados, e há todos os tipos de compensações envolvidas.Só para dar um exemplo:BigTable não pode fazer consultas de agregação, tais como dar a você uma contagem.Ele pode ser usado para dar-lhe uma figura que é aproximadamente exato, no sentido de que, se você tem, digamos, 12,149,173 registros de que 23,721 foram adicionados na última hora, isso realmente não importa se o melhor que você pode descobrir que você tem "sobre 12,100,000 registros".Se a sua aplicação depende de saber o exacto figura em qualquer momento, então você não deve estar usando o BigTable para ele, é a atitude geral.

Aplicações como o facebook têm muito poucas as alterações de dados, a maior parte do tempo os usuários estão postando novos itens.Assim, o fato de que multiplicam os registros necessidade de atualização quando um item é alterado é menor problema.

Isso permite que permite que os dados não sejam normalizado sem bater em comum problemas com as atualizações.

Aplicações como a Amazon pode se dar ao luxo de carregar todos os dados para um único usuário em RAM (quão grande é um carrinho de compras, afinal?), em seguida, atualizar os dados na memória RAM, e escreve como um único item de dados.

Mais uma vez, eliminando a necessidade de ter a maioria dos dados normalizados.

Você está de negociação de escala para facilitar o desenvolvimento de aplicações, por isso, se você não precisa de escala para grandes alturas você pode querer manter a facilidade de desenvolvimento de aplicações que RDBMS fornecer.

Eu acho que nessas situações você vai ser muito bonito em seu próprio país e vai ter que rolar tudo sozinho.Eu não fui lá, mas tem considerado que, para alguns de nossos projetos.Você pode obter muito grande com relacional DBs (como ASSIM o demonstra), de modo que vou continuar a desfrutar relacional bondade para agora.

Geralmente, o armazenamento de dados é construído em torno de utilizar associações e divisão de dados em dimensões e tabelas de fatos (com os chamados "esquemas em estrela", etc)

Junta-se muitas vezes será pré-calculados e armazenados de tabelas normalizadas.

Eu não estou ciente de qualquer ferramentas de ORM que trabalham com sistemas de banco de dados que não permitem a junta, como estes não são geralmente vistos como tradicionais bancos de dados relacionais.

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