Pergunta

Eu tenho lido muito ultimamente sobre como se junta DB consulta coisas lentas para baixo. Evidentemente, o Google App Engine não permitem mesmo que eles.

Eu estou querendo saber como as pessoas projetar um aplicativo sem junta-se embora. Por exemplo, eu estou trabalhando em um aplicativo que tem contacts e organizations. Um contato pode ser em muitas organizações e uma organização pode ter muitos contatos. Como seria possível ter esse relacionamento sem uma terceira tabela que liga as duas entidades ...

contacts --< contacts_organizations >-- organizations

Isso significa que em GAE você não pode ter um relacionamento muitos-para-muitos? Você acabou de deixar de fora a funcionalidade que exigiria uma junção?

Eu acho que você poderia ter uma coluna TEXT organizations na tabela de contacts contendo uma lista separada por espaços dos IDs organização para cada contato. Isso parece um pouco embora estranho.

Foi útil?

Solução

Normalmente, quando você está falando de bancos de dados não permitindo que se junta, você está falando de grandes bases de dados que não necessariamente se encaixam em um servidor. Os exemplos recentes sendo as bases de dados em nuvem como da Amazon SimpleDB , Serviços de dados SQL da Microsoft , e App Engine Datastore do Google . Alguns oferta limitada juntar a capacidade, mas a grande dificuldade está fazendo junta-se através " partições " . Em grandes bases de dados como este, você particionar os seus dados para que ele não tem que residir no mesmo servidor. Você tem que decidir o caminho certo para particionar-lo.

No seu exemplo, eu iria armazenar uma lista de chaves de organização em um campo na tabela de contatos, e vice-versa. O design destes bancos de dados é diferente do seu banco de dados típico normalizado. As tabelas são geralmente "tabelas esparsas", o que significa, basicamente, cada registro pode ter qualquer número de campos que são basicamente pares nome / valor. Pense em uma tabela de produtos na Amazon, e como muitos campos diferentes poderia haver para diferentes tipos de produtos. Os livros têm número de páginas, mas MP3s têm duração. Em uma mesa escassa, esses registros serão armazenados na mesma tabela.

Outras dicas

É um mito que une software devagar, da mesma forma que seria um mito afirmar escrita laços no código do aplicativo software abrandar.

Quero dizer, por que escrever um loop? Que apenas executa as mesmas linhas de código novo e de novo! Não era uma vez o suficiente? É um desperdício tremendo!

As afirmações acima são destinados a ser irônico.

Meu ponto é que a consulta contém uma junção para um propósito: para obter a resposta certa. Usando junta-se ineficiente ou desnecessariamente é de projeto do curso pobres, como a colocação de código de loop-invariante dentro de um loop.

Evitar junta-se como uma política geral é um exemplo de otimização prematura . Se a sua abordagem para escrever código eficiente é para chegar a regras gerais como essa, em seguida, evitando junta não vai ajudá-lo.


Como para o Google App Engine, que faz relações de apoio entre as entidades, mas uma vez que não é estritamente um modelo de banco de dados relacional, o conceito de uma junção não realmente vir para cima. Em vez disso, você pode obter entidades relacionadas de um dado de referência, que é mais como uma interface ORM para um modelo, não é a mesma coisa que uma junção em SQL.

Você pode ler mais aqui: http://code.google.com/appengine/articles/modeling.html

(que apontam estava em outra resposta sobre esta discussão, mas foi deletado)

-Nit escolhendo ponto: o Google não JOINs disallow em seu banco de dados para impedir que os usuários executem consultas "caro"; o banco de dados não é relacional, de modo a "Cadastre-se" verbo SQL não é realmente aplicável em primeiro lugar.

Desta forma, BigTable é o mesmo que SimpleDB da Amazon - os dados são Desnormaliza e despojado de esquemas de modo que você acabar efetivamente com enormes, tabelas hash eficientes com dados arbitrários permitidos nos baldes.

Estas tabelas hash são muito, muito fácil de escala, especialmente em comparação com bancos de dados relacionais. Para aplicações como GAE, extrema escalabilidade é uma prioridade maior do que um conjunto de recursos completo.

Você usa o db.ReferenceProperty para objetos de link, veja Google App Engine: One-para-muitos para detalhes e exemplos.

Eu acho que o Google está rasgando-o de algum mecanismo de computação pesada assim que você vai procurar maneiras que vai utilizar mais de outros tipos de recursos, por exemplo, discos rígidos manutenção de tabelas de referência e / ou tabelas de contagem em vez de ciclos de CPU desperdiçando para junta e cálculo agregado.

E não é impossível, você só precisa resolver isso usando outros tipos de recursos para ajudá-lo.

Você pode executar junta-se a sua aplicação em vez do servidor DB, por buscar resultados de cada tabela separadamente e depois combiná-los, mas para a maioria junta-se a fazer isso só vai ficar mais lento devido à latência de fazer vários bancos de dados round-trips em vez de apenas um.

Mas: a verdade é que une não é o seu problema. Até o momento eles são, se alguma vez, você não precisa mesmo de fazer esta pergunta. Você pode contar o número de projetos da vida real que chegar a este ponto em seus dedos (principalmente Ebay), e não há evidências de que a eliminação se junta inteiramente era a única maneira desses projetos poderia ter sido feito para escala.

As bases de dados que você menciona são, na melhor das hipóteses, versionadas lojas de discos destinados a armazenar grandes volumes de dados em vários servidores. Para chamar-lhes um 'banco de dados' seria um estiramento. O apoio não se junta, nem transações ACID, reversões, etc. Você pode escrever aplicações sem eles, mas, muitas vezes, tem que fazer mais trabalho para fornecer a funcionalidade.

Para:

contacts --< contacts_organizations >-- organizations

Você poderia deNormailize e organizações de loja em contatos e contatos em orgainizations. Mas você vai ter que impor a integridade referencial no negócio de aplicativos com simultânea atualizado para ambas as tabelas.

A melhor solução seria armazenar os dados em três mesas e fazer o 'junta' a si mesmo.

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