Google app engine 应用程序引擎&x27;s的反向引用太慢。我怎样才能使它更快?

Google app engine 应用程序引擎&x27;s的反向引用太慢。我怎样才能使它更快?,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,GoogleAppEngine有一个名为backreferences的智能功能,我通常在需要使用传统SQL计算列的地方迭代它们 想象一下,需要累积特定力量的总生命 class Force(db.Model): hp = db.IntegerProperty() class UnitGroup(db.Model): force = db.ReferenceProperty(reference_class=Force,collection_name="groups") hp = db.I

GoogleAppEngine有一个名为backreferences的智能功能,我通常在需要使用传统SQL计算列的地方迭代它们

想象一下,需要累积特定力量的总生命

class Force(db.Model):
  hp = db.IntegerProperty()
class UnitGroup(db.Model):
  force = db.ReferenceProperty(reference_class=Force,collection_name="groups")
  hp = db.IntegerProperty()
class Unit(db.Model):
  group = db.ReferenceProperty(reference_class=UnitGroup,collection_name="units")
  hp = db.IntegerProperty()
当我像下面这样编写代码时,它的速度非常慢(几乎3秒),有20个部队,一个小组,一个单位。(我猜返回引用强制重新加载子实体。我说的对吗?)


如何优化此代码?请考虑每一个力/单位组应该有更多的属性,我不想把这些集体属性保存到每个实体。p> 看来,力、单位组和单位都能很好地融入到一个系统中。每个单位都属于一个且仅属于一个单位组,每个单位组都属于一个且仅属于一个力,这是真的吗?如果这是真的,那么您可以将这些实体存储为实体组,并使用祖先查询来减少数据存储查询的数量

将实体放入实体组是通过在创建实体组时设置其父属性来完成的。完成后,您可以通过一个单独的命令获得属于某个力的所有单位


也就是说,正确的做法是在将实体写入数据库时计算值,而不是在读取实体时。这个简单的事实已经在这里和其他地方被反复提到,这是获得AppEngine应用程序良好性能的最佳方法。这可能看起来是一项大量的前期工作,对于任何有传统SQL数据库背景的人来说,这都是非常不直观的,但这正是你想要做的,简单明了。

应用程序引擎上的存储便宜,CPU和请求时间也少。关于数据存储,您应该记住的主要一点是,您应该针对读取而不是写入进行优化——最终您读取数据的频率将远远高于写入数据的频率


如果您认为可能需要了解某个
的总
hp
,则应将其存储在名为
total\u hp
的字段中,并在每次更新/添加/删除其
UnitGroup
Unit
时使用新值对其进行更新。您可能也应该在事务中这样做,这意味着它们需要在同一个实体组中。

小心不要创建太大的实体组。同一实体组中的所有内容都必须驻留在同一台服务器上,谷歌对一次可以完成多少更新设置了一些限制。请参阅本页顶部的说明
def get_hp(self):
    hp = 0
    for group in self.groups:
        group_hp = 0
        for unit in group.units:
            group_hp += unit.hp
        hp += group_hp
    return hp