如何在Google App Engine数据存储区中对我的应用进行建模

时间:2011-07-28 11:55:52

标签: python google-app-engine google-cloud-datastore

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

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

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(在下面的示例中〜 65.000次行动)

我有一个事件示例:

  • 4人
  • 76交易
  • 213 TransactionPerson

对起始页面的请求显示每人和所有交易的余额摘要:

real: 1863ms
cpu: 6900ms (1769ms real)
api: 2723ms (94ms real)

目前我只做3个RPC请求来获取事件的所有人员,事务和事务处理器,然后在应用程序中执行所有“关系”工作,这就是为什么cpu ms非常高。

问题:

  1. 只需要2723ms的api cpu来从3个数据存储区请求中获取293个对象,这不是很高吗?实时是好的(94毫秒),但我的api cpu配额需要很多?

  2. 我如何设计它以获得更好的性能?对于上面这个例子,今天的真实时间是1863年,但是如果有例如12个人,则时间将增加三倍。这些是不可接受的响应时间。

  3. 谢谢!

1 个答案:

答案 0 :(得分:1)

通常,您希望优化读取。

不是在读取时计算人的余额,而是在写入时计算更改并进行非规范化,将计算的余额存储在Person实体中。