我很难理解 Google App Engine数据存储的机制。
我想了解机制,以便以数据库的最佳方式构建数据库。
根据下面的例子,有人可以帮助我:
示例:
假设我有N个棒球运动员,每个人都有一个唯一的ID
我想保持每个玩家击中本垒打的每日记录(存储“每日全部归属”属性),并且当本垒打被击中时基本上增加它。
所以,随着时间的推移,我想每年为每位棒球运动员展示一份本垒打图表。
Player 1
1/21/2011 - 2 homeruns
1/22/2011 - 0 homeruns
1/23/2011 - 1 homeruns
阅读要求:阅读某个玩家每日“本垒打”数据的最近5年?
写作要求:增加某个棒球运动员的每日本垒打次数。
我很想了解如何构建数据以及读写的机制?这个简单的存储任务会扩展吗?谢谢大家。
答案 0 :(得分:3)
我会使用一对多关系为您的需求建模,如下所示:
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性能查询 缩放与结果集的大小 而不是数据集的大小。
这意味着,如果您的过去5年的本地查询集合平均包含800个实体 * ,则无论是搜索超过一千个实体还是百万个实体,此查询都会执行相同的操作实体。
写作要求 :
Google App Engine中的写入速度很慢,但您的方案似乎非常简单,我没有看到任何可能的争用/超时问题;
毕竟你只需要每天少量地连续更新DailyHomeruns
递增计数器。
其他想法 :
如果您需要计算某些统计信息,例如给定Player
的Homeruns总数,则甚至不要考虑将GQL用于此目的,因为它不提供任何聚合函数àla{ {1}}。
相反,您必须预先设计数据库,定义一个模型来存储每个玩家的Homeruns总数
使用transactions API,每次增加SQL
时,您都需要为该播放器增加TotalHomeruns实体。
*我估计每周有3场比赛为52周,每5年一次
答案 1 :(得分:2)
这个问题没有一个答案。数据存储区实际上是低级别的,您可以创建正确的索引和预处理数据,以便更快地检索它。此外,根据对同一实体的并发访问权限,您必须使用非常有创意的内容,例如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 - 很高兴为数据存储的局限性开辟新的解决方案。