Оптимизация ссылочных свойств App Engine - PullRequest
1 голос
/ 10 октября 2010

У меня есть такая структура базы данных -

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).Как мне это оптимизировать?Я попытался использовать memcaching, но первый вызов все еще очень медленный и вызывает тайм-аут ответа 30 с.

1 Ответ

5 голосов
/ 10 октября 2010

Вы должны смоделировать свои сущности примерно так:

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.movies, чтобы получить все фильмы, которые принадлежат определенному тегу.

Больше информации на GAE: Моделирование отношений сущностей

...