App Engine参考属性优化

时间:2010-10-10 14:18:26

标签: google-app-engine google-cloud-datastore

我有这样的数据库结构 -

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')

我有一个查询,我试图用标签检索所有电影。我有这样的查询。

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

然而,这需要很长时间才能拍摄大量电影(约400张)。我该如何优化?我尝试了内存缓存,但第一次调用仍然很慢,导致30秒响应超时。

1 个答案:

答案 0 :(得分:5)

您应该为您的实体建模如下:

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())

在此方案中,您可以调用Tag.movi​​es来获取属于某个标签的所有电影。

GAE: Modeling Entity Relationships

的更多信息