App Engine参考属性优化

lam*_*rap 1 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')
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sha*_*men 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())
Run Code Online (Sandbox Code Playgroud)

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

更多信息在GAE:建模实体关系