Уменьшение количества read'ов в GAE. Вопрос по моделированию DS

Допустим есть страница отображающая одну статью. У статьи есть 4 тега. И есть два варианта реализации этого в DataStore. Первый обычный — статья ссылается на записи в другой таблице:

class Article(db.Model):
  tags = db.ListProperty(db.Key)


Вариант второй, менее гибкий — статья не содержит ссылок вовне, но содержит имена (строки) тегов в себе.

class Article(db.Model):
  tags = db.StringListProperty()


Статья выбирается из базы просто: Article.get(key)

Вопрос. Можно ли сказать что запрос страницы вызовет в первом случае 5 операций чтения, а во втором — всего одну? (Операции чтения — те которые учитываются контролем квот.)
  • Вопрос задан
  • 2548 просмотров
Пригласить эксперта
Ответы на вопрос 1
avalak
@avalak
Как профилировать приложение:
import os

# ...

if os.getenv('SERVER_SOFTWARE', '').startswith('Dev'):
  # http://localhost:8080/_ah/stats/ - тут появится подробная статистика: запросы, время, вызовы api
  from google.appengine.ext.appstats import recording
  app = recording.appstats_wsgi_middleware(app)


В первом случае можно обойтись двумя вызовами (0 при кешировании выборки в gae memcache):
class Artwork(db.Model):
  refs = db.ListProperty(db.Key)
  @property
  def taxonomy(self):
    return db.get(self.refs)


Можно сократить количество вызовов, передавая в db.get и db.put сразу несколько значений
# 100 вызовов
for tag in tags: db.put(Tag(tag))


# 1 вызов
db.put([Tag(tag) for tag in tags])


Во втором случае будет всего один вызов RPC, тк хранятся строки (0 при кешировании).

Ну и по возможности нужно кешировать выборку в gae memcache, тк это быстрее и запросы туда не учитываются.

PS Nick's Blog — ReferenceProperty prefetching in App Engine — отличные материалы по GAE от Ника Джонсона
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы