我很难理解 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年增加一次

    10-06 02:25