Pergunta

Am saber se alguém pode dar alguns conselhos conceitual sobre uma maneira eficiente de construir um modelo de dados para realizar o sistema simples descrito abaixo. Sou um pouco novo para pensar de forma não-relacional e quer tentar evitar as armadilhas óbvias. É meu entendimento que um princípio básico é que "o armazenamento é barato, não se preocupe com a duplicação de dados", como você pode em um RDBMS normalizado.

O que eu gostaria de modelo é:

Um artigo que pode ser dado 0-n etiquetas de blog. Muitos artigos do blog podem compartilhar a mesma tag. Ao recuperar dados gostaria de permitir a recuperação de todos os artigos que combinam com uma tag. De muitas maneiras, muito semelhante ao método utilizado aqui em stackoverflow.

A minha mentalidade normal seria criar um relacionamento muitos-para-may entre tags e artigos do blog. No entanto, estou pensando no contexto do GAE que este seria caro, embora eu tenha visto exemplos de ele ser feito.

Talvez usando um ListProperty contendo cada tag como parte das entidades do artigo, e um segundo modelo de dados para rastrear as tags como eles são adicionados e excluídos? Desta forma, não há necessidade de quaisquer relacionamentos ea ListProperty ainda permite consultas onde qualquer lista elemento correspondente retorne resultados.

Todas as sugestões sobre a forma mais eficiente de abordar esta questão no GAE?

Foi útil?

Solução

Graças a ambos por suas sugestões. Eu tenho implementado (primeira iteração) como segue. Não tenho certeza se é a melhor abordagem, mas ele está trabalhando.

Classe A = artigos. Tem uma StringListProperty que pode ser consultado sobre a sua lista de elementos

Classe B = Etiquetas. Uma entidade por tag, também mantém uma contagem do número total de artigos usando cada tag.

modificações de dados para um são acompanhados por trabalhos de manutenção na B. Pensando que conta a ser pré-calculado é uma abordagem bem em um ambiente de leitura pesada.

Outras dicas

contagens de ser pré-computados é não só prática , mas também necessário porque a contagem () devolve um máximo de 1000 . Se write-contenção pode ser um problema, certifique-se de verificar o contra-exemplo sharded.

http://code.google.com/appengine/articles/sharding_counters.html

Muitos-para-muitos sons razoável. Talvez você deve experimentá-lo primeiro para ver se ele é realmente caro.

Boa coisa sobre G.A.E. é que ele vai dizer quando você está usando muitos ciclos. Profiling de graça!

Uma forma possível é com Expando, onde pretende adicionar uma tag como:

setattr(entity, 'tag_'+tag_name, True)

Em seguida, você pode consultar todas as entidades com uma tag como:

def get_all_with_tag(model_class, tag):
    return model_class.all().filter('tag_%s =' % tag, True)

É claro que você tem que limpar suas tags para ser identificadores Python apropriados. Eu não tentei isso, então eu não tenho certeza se é realmente uma boa solução.

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