如何在谷歌应用程序引擎数据存储模型我的应用程序



我很难对我的应用程序数据进行建模以获得合理的性能。

这是一个跟踪一群人的成本的应用程序,今天我有以下实体:

class Event(db.Model):
    # Values
    name = db.StringProperty(required=True)
    password = db.StringProperty(required=True)
class Person(db.Model):
    # References
    event = db.ReferenceProperty(Event, required=True)
    # Values
    name = db.StringProperty(required=True)
class Transaction(db.Model):
    # References
    event = db.ReferenceProperty(Event, required=True)
    paidby = db.ReferenceProperty(Person, required=True)
    # Values
    description = db.StringProperty(required=True)
    amount = db.FloatProperty(required=True)
    datetime = db.DateTimeProperty(auto_now_add=True)
# This is used because a transaction might not distribute costs
# evenly across all persons belonging to the event
class TransactionPerson(db.Model):
    # References
    event = db.ReferenceProperty(Event, required=False)
    transaction = db.ReferenceProperty(Transaction, required=True)
    person = db.ReferenceProperty(Person, required=True)
    # Values
    amount = db.FloatProperty(required=True)

问题是,例如,当我想计算每个人的余额时,那么我必须获得与事件相关的所有数据,并为每个Transaction/person组合循环所有TransactionPerson(在下面的示例中,约为65000个操作)

我有一个事件示例:

    <
  • 4人/gh><
  • 76个事务/gh>213 TransactionPerson

以及对显示每个人和所有事务的余额摘要的开始页的请求:

<>之前真实:1863毫秒Cpu: 6900ms(实际1769ms)Api: 2723ms(实际94ms)之前

目前,我只做3个RPC请求来获取事件的所有人员,事务和事务人员,然后在应用程序中做所有的"关系"工作,这就是为什么cpu ms相当高的原因。

问题:

  1. 它需要2723ms api cpu只从3个数据存储请求获得293个对象,不是很高吗?实时时间还可以(94毫秒),但它占用了我的api cpu配额很多?

  2. 我如何设计它以获得更好的性能?对于上面的例子,今天的实际时间是1863年,但如果有12个人,时间就会增加三倍。

谢谢!

通常情况下,您需要针对读取进行优化。

不是在读取时计算一个人的余额,而是在写入时计算变化并非规范化,将计算的余额存储在person实体中。

最新更新