Объяснение соображений производительности чтения / записи в Google Datastore (GAE)? - PullRequest
5 голосов
/ 17 февраля 2011

Мне очень трудно разобраться в механике хранилища данных Google App Engine .
Я хочу понять механику, чтобы я мог построить свою базу данных оптимальным образом для базы данных.

Учитывая мой пример ниже, может ли кто-нибудь помочь мне в:

  1. оптимально структурировать базу данных
  2. понимают производительность как чтения, так и записи, учитывая эту структуру

Пример:
Допустим, у меня N игроков в бейсбол, и у каждого есть уникальный идентификатор.
Я хотел бы вести ежедневный подсчет ударов по homeruns каждого игрока (сохраняя свойство «total homeruns») и увеличивать его при ударе homerun. Итак, с течением времени я хотел бы показывать график homeruns каждый день для каждого бейсболиста за X лет.

Player 1
1/21/2011 - 2 homeruns
1/22/2011 - 0 homeruns
1/23/2011 - 1 homeruns

Требование о прочтении : Считать последние 5 лет ежедневных данных "homerun" для определенного игрока?

Требование к записи : Увеличение ежедневного счета homerun для определенного игрока в бейсбол.

Мне бы хотелось понять, как структурировать данные, а также механизм чтения и записи? Будет ли масштабироваться эта простая задача хранения? Спасибо всем.

Ответы [ 2 ]

3 голосов
/ 18 февраля 2011

Я бы смоделировал ваши требования с отношением один ко многим следующим образом:

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

class DailyHomeruns(db.Model):
  date = db.DateProperty()
  counter = db.IntegerProperty()
  player = db.ReferenceProperty(Player)

Чтобы получить все DailyHomeruns данного Player, вы можете сделать это следующим образом:

daily_homeruns = DailyHomeruns.all().filter('player =', player)
                                    .filter('date >', date_start)
                                    .filter('date <=', date_end)
                                    .order('date')

Требование к прочтению :

Запросы производительности Google App Engine масштабируется с размером набора результатов а не с размером набора данных.

Это означает, что если ваш набор запросов homeruns за последние 5 лет содержит в среднем 800 сущностей *, этот запрос выполняется одинаково, независимо от того, ищет ли он тысячу сущностей или миллион сущностей.

Требование к записи :
Пишет медленно в Google App Engine, но ваш сценарий кажется довольно тривиальным, и я не вижу никакой возможной проблемы конкуренции / тайм-аута; в конце концов, вам просто нужно последовательно обновлять счетчик с приращением DailyHomeruns небольшое количество раз в день.

Другие мысли :
Если вам нужно вычислить некоторые характеристики, например, общее количество Homeruns для данного Player, даже не думайте использовать GQL для этой цели, потому что он не предоставляет какой-либо агрегатной функции à la SQL.
Вместо этого вам нужно спроектировать базу данных заранее, определив модель для хранения общего количества Homeruns на игрока.
Используя API транзакций , каждый раз, когда вы увеличиваете DailyHomeruns, вам нужно будет увеличивать сущность TotalHomeruns для этого игрока.

* По моим оценкам, 3 матча в неделю по 52 недели, умноженные на 5 лет

2 голосов
/ 18 февраля 2011

На этот вопрос нет однозначного ответа.Хранилище данных действительно низкого уровня, и вам нужно создать правильные индексы и данные предварительной обработки, чтобы их можно было получить быстрее.Кроме того, в зависимости от одновременного доступа к одной и той же сущности вам придется использовать довольно креативные вещи, такие как http://code.google.com/appengine/articles/sharding_counters.html

. Я могу порекомендовать вам посмотреть две сессии Google I / O, чтобы начать работу http://sites.google.com/site/io/under-the-covers-of-the-google-app-engine-datastore дает вам низкоуровневый обзор того, как все работает и почему они были сделаны таким образом (вплоть до того, как сектора записываются на диск)

Тогда http://sites.google.com/site/io/building-scalable-web-applications-with-google-app-engine покажет вам, как это использоватьвещи низкого уровня в реальных приложениях.

Есть еще один, который представляет другие решения общих проблем http://www.google.com/events/io/2009/sessions/BuildingScalableComplexApps.html - приятно открыть свой разум для новых видов решений ограничений хранилища данных.

...