Я бы смоделировал ваши требования с отношением один ко многим следующим образом:
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 лет