Pergunta

Os novos paradigmas de armazenamento de dados escola como Google BigTable e Amazon SimpleDB são projetados especificamente para escalabilidade, entre outras coisas. Basicamente, não permitindo junta e desnormalização são as maneiras isto está sendo realizado.

Na este tema , no entanto, o consenso parece ser que se junta em grande tabelas não necessarilly tem que ser muito caro e desnormalização é "sobrestimado" até certo ponto Por que, então, fazer estes sistemas acima mencionados disallow junta e força tudo junto em uma única tabela para alcançar escalabilidade? É o volume total de dados que precisam ser armazenados nestes sistemas (muitos terabytes)?
Será que as regras gerais para bancos de dados simplesmente não se aplicam a essas escalas? Será que é porque estes tipos de bancos de dados são adaptados especificamente para armazenar muitos objetos semelhantes?
Ou estou faltando alguma imagem maior?

Foi útil?

Solução

bancos de dados distribuídos não são tão ingênuos a ponto Orion implica; tem havido um pouco de trabalho feito na otimização de consultas totalmente relacionais sobre conjuntos de dados distribuídos. Você pode querer olhar para o que empresas como a Teradata, Netezza, a Greenplum, Vertica, AsterData, etc estão fazendo. (Oracle entrou no jogo, finalmente, também, com o seu recente anúncio, a Microsoft comprou a sua solition em nome da empresa que costumava ser chamado de DataAllegro)

.

Dito isto, quando os dados dimensiona-se em terabytes, estas questões tornam-se muito não-trivial. Se você não precisa as transacionalidade e consistência rigorosas garantias que você pode começar a partir RDBMs, muitas vezes é muito mais fácil de desnormalizar e não se junta. Especialmente se você não precisa de referência cruzada muito. Especialmente se você não está fazendo a análise ad-hoc, mas requerem acesso programático com transformações arbitrárias.

Desnormalização é superestimada. Só porque é isso que acontece quando você está lidando com um 100 Tera, não significa que este fato deve ser usado por todos os desenvolvedores que nunca se preocupou em aprender sobre bancos de dados e tem dificuldade consultando um milhão ou duas linhas devido ao planejamento esquema pobres e otimização de consultas .

Mas se você está na faixa de 100 Tera, por todos os meios ...

Oh, o outro motivo estas tecnologias estão recebendo o zumbido - as pessoas estão descobrindo que algumas coisas nunca pertenceu no banco de dados, em primeiro lugar, e estão percebendo que eles não estão lidando com relações em seus campos particulares, mas com pares básicos de valor-chave. Para as coisas que não deveria ter sido em um DB, é perfeitamente possível que o Map-Reduce quadro, ou algum sistema de armazenamento persistente, eventualmente, consistentes, é apenas a coisa.

Em uma escala menor global, eu recomendo BerkeleyDB para esses tipos de problemas.

Outras dicas

Eu não estou muito familiarizado com eles (eu só li mesmo blog / Notícias / exemplos como todos os outros), mas minha opinião sobre ele é que eles escolheram para sacrificar um monte de banco de dados relacional normal, apresenta em nome de escalabilidade - vou tentar explicar

.

Imagine que você tem 200 linhas em seus dados da tabela.

centro de dados de Na Google, 50 destas linhas são armazenadas no servidor A, 50 em B, e 100 no servidor C. Além disso servidor D contém cópias redundantes de dados de servidor A e B, e servidor E contém cópias redundantes de dados sobre servidor C.

(Na vida real eu não tenho idéia de quantos servidores seriam usados, mas está configurado para lidar com muitos milhões de linhas, então eu imagino muito poucos).

Para "select * onde name = 'Orion'", a infra-estrutura pode disparar essa consulta a todos os servidores, e agregar os resultados que vêm de trás. Isto permite-lhes escalar praticamente linear em toda como muitos servidores como eles gostam (FYI este é muito bonito o que mapreduce é)

Este, porém, significa que você precisa de algumas compensações.

Se você precisava fazer um relacional juntar-se em alguns dados, onde era espalhados por dizer 5 servidores, cada um desses servidores seria necessário para extrair dados de eachother para cada linha . Tente fazer isso quando você tem 2 milhões de linhas espalhadas por 10 servidores.

Isto leva a troca # 1 -. Não se junta

Além disso, dependendo da latência da rede, a carga do servidor, etc, alguns dos seus dados podem ser salvos instantaneamente, mas alguns podem ter um segundo ou 2. Mais uma vez, quando você tem dezenas de servidores, isso fica mais e mais, eo abordagem normal do 'todo mundo só espera até que o cara mais lento tem acabado' já não se torna aceitável.

Isto leva a troca # 2 -. Seus dados podem não ser sempre visíveis imediatamente após ele é escrito

Eu não tenho certeza que outras compensações existem, mas em cima da minha cabeça esses são a principal 2.

Então o que eu estou recebendo é que todo o "denormalize, não se junta" existe filosofia, não porque junta-se não escala em grandes sistemas, mas porque eles são praticamente impossível de implementar em bancos de dados distribuídos.

Isso parece bastante razoável quando você está armazenando os dados em grande parte invariante de um único tipo (como o Google faz). Am I no caminho certo aqui?

Se você está falando de dados que é praticamente só de leitura, a mudança de regras. Desnormalização é mais difícil em situações em que as alterações de dados, porque o trabalho necessário é maior e há mais problemas com o bloqueio. Se os dados mal muda então desnormalização não é tanto de um problema.

Novaday Você precisa encontrar ambiente mais interoperacional para bancos de dados. Mais freqüentemente Você não precisa apenas um BDs relacionais, como MySQL ou MS SQL, mas também Big Data fazendas como Hadoop ou bancos de dados não relacionais como MongoDB. Em alguns casos, todos os bancos de dados serão utilizados em uma única solução para que seu desempenho deve ser tão iguais quanto possível em escala macro. Isso significa que você não será capaz de usar Vamos dizer Azure SQL como banco de dados relacional e um VM com 2 núcleos e 3GB de RAM para MongoDB. Você deve dimensionar-se a sua solução e usar DB como um serviço quando é possível (se não for possível, em seguida, construir o seu próprio cluster em uma nuvem).

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