我很难理解 Google App Engine数据存储库的机制。
我想了解机制,以便以最佳方式为数据库建立数据库。
给我下面的例子,有人可以帮助我吗:
示例:
假设我有N个棒球运动员,每个人都有一个唯一的ID。
我想保持每个玩家每日击出的本垒打的总和(存储“每日总本垒打”属性),并在击中本垒打时基本上将其增加。
因此,随着时间的增加,我想显示X年内每个棒球运动员每天的全垒打图。
Player 1
1/21/2011 - 2 homeruns
1/22/2011 - 0 homeruns
1/23/2011 - 1 homeruns
读取要求:读取某个玩家的每日最近5年的“本垒打”数据?
写作要求:增加某位棒球运动员的每日本垒打计数。
我想了解如何构造数据以及读写机制?这个简单的存储任务会扩展规模吗?谢谢大家
最佳答案
我将使用一对多关系来对您的需求进行建模,如下所示:
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')
阅读要求:
这意味着,如果您最近5年的“本垒打”查询集平均包含800个实体*,则无论搜索一千个实体还是一百万个实体,此查询的效果都相同。
书写要求:
在Google App Engine中写入速度很慢,但是您的情况看起来很琐碎,我看不到任何可能的争用/超时问题;
毕竟,您每天只需要串行更新
DailyHomeruns
即可使计数器递增一小段次数。其他想法:
如果您需要计算一些统计信息(例如,给定
Player
的本垒打总数),甚至不要考虑为此使用GQL,因为它没有提供任何合计函数àla SQL
。相反,您必须预先设计数据库,定义一个模型来存储每个玩家的本垒打总数。
使用transactions API,每次增加
DailyHomeruns
时,都需要增加该Player的TotalHomeruns实体。*我估计每周比赛3场,连续52周,每5年增加一次