2010-10-10 4 views
1

J'ai une structure de base de données comme celui-ci -App Engine référence optimisation de la propriété

class Movie(db.Model): 
    name = db.StringProperty() 

class Tag(db.Model): 
    name = db.StringProperty() 

class MovieTag(db.Model): 
    movie = db.ReferenceProperty(Movie, collection_name='tags') 
    tag = db.ReferenceProperty(Tag, collection_name='movies') 

J'ai une requête où je suis en train de récupérer tous les films avec les tags. J'ai une requête comme celle-ci.

query = Movie.all() 
movies = [{"name":movie.name, 
      "tags":[t.tag.name for t in movie.tags]} for movie in query] 

Cependant, cela prend très longtemps surtout avec un grand nombre de films (environ 400). Comment puis-je optimiser cela? J'ai essayé le memcaching mais le premier appel est toujours très lent et cause le délai de réponse de 30s.

Répondre

5

Vous devriez modéliser vos entités quelque chose comme ceci:

class Movie(db.Model): 
    name = db.StringProperty() 
    tags = db.ListProperty(db.Key) 

class Tag(db.Model): 
    name = db.CategoryProperty() 
    @property 
    def movies(self): 
    return Movie.gql("WHERE tags = :1", self.key()) 

Dans ce schéma, vous pouvez appeler Tag.movies pour obtenir tous les films qui appartiennent à une certaine étiquette.

Plus d'infos sur GAE: Modeling Entity Relationships

+0

grâce ... Je vais essayer :) – lamirap

+1

Sinon, le modèle balises d'un film comme StringListProperty, et utiliser le nom de la balise comme key_name dans le modèle d'étiquette. –