No Google App Engine, qual é o modelo de associação muitos para muitos mais eficaz?

9

O design da BigTable rejeita muitas das filosofias dos modelos relacionais padrão, preferindo explicitamente a desnormalização a uma grande variedade de pequenas tabelas.

Uma das áreas maiores em que isso é um problema está na modelagem de muitas e muitas junções.

Uma maneira de modelar essas junções é violar a primeira forma normal e colocar todos os dados interessantes em um db.ListProperty (). Embora isso possa ser pesquisado em uma consulta, ainda não explorei as implicações de desempenho de pesquisar em uma lista em vez de puxar outra tabela.

Como as junções não são possíveis, é possível vincular tabelas por meio de RelationshipProperties. Portanto, com esforço suficiente, a tabela de interseção padrão (uma tabela com uma chave primária conjunta que faz referência a ambas as tabelas pai) pode ser criada. Alguém já explorou os resultados de desempenho das várias implementações?

-Editar-

Embora a Lista de Chaves sugerida na documentação seja realmente uma maneira de fazê-lo, estou interessado nas taxas de desempenho e anomalia dessa e de outras implementações. Existe utilidade na criação de listas mútuas de chaves? O esforço envolvido nas repetidas vale o preço? Tem algum jeito melhor de fazer isso?

Brian Ballsun-Stanton
fonte

Respostas:

3

Também estou trabalhando com o armazenamento de dados do GAE agora, verifique este artigo se ainda não o fez. Se você encontrou algo útil, atualize sua pergunta.

EDITAR:

Encontrei isso hoje, confira.

eiefai
fonte
0

Na minha experiência no GAE, você deve usar consultas de tabela com moderação. Adicionar uma tabela "join" apenas atrasaria ainda mais as coisas. Por exemplo, se você possui as tabelas A e B que compartilham um relacionamento muitos-para-muitos e cria uma tabela "junção" J com os campos RelationshipProperty para A e B, terá que consultar J toda vez que desejar encontrar registros relacionados (entidades).

Seria muito mais rápido ter a lista de chaves em A ou B (ou ambas, se necessário), porque elas serão incluídas quando você buscar esse registro / entidade. Desde que você não tenha muitas chaves na lista (ou seja, a entidade não é muito grande), esse é o caminho a seguir.

Comecei a usar o ndb em meus aplicativos e há alguns benefícios significativos no uso de chaves ao buscar entidades. Se a entidade já estiver armazenada em cache, ela a retirará da memória ou do memcache primeiro. Portanto, se houver uma sobreposição significativa em suas Listas de chaves, as buscas serão muito mais rápidas para as entidades que já foram buscadas.

Brent Washburne
fonte