我很难对应用程序数据进行建模以获得合理的性能。
这是一个跟踪一组人的成本的应用程序,今天我有以下实体:
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次行动)
我有一个事件示例:
对起始页面的请求显示每人和所有交易的余额摘要:
real: 1863ms cpu: 6900ms (1769ms real) api: 2723ms (94ms real)
目前我只做3个RPC请求来获取事件的所有人员,事务和事务处理器,然后在应用程序中执行所有“关系”工作,这就是为什么cpu ms非常高。
问题:
只需要2723ms的api cpu来从3个数据存储区请求中获取293个对象,这不是很高吗?实时是好的(94毫秒),但我的api cpu配额需要很多?
我如何设计它以获得更好的性能?对于上面这个例子,今天的真实时间是1863年,但是如果有例如12个人,则时间将增加三倍。这些是不可接受的响应时间。
谢谢!
答案 0 :(得分:1)
通常,您希望优化读取。
不是在读取时计算人的余额,而是在写入时计算更改并进行非规范化,将计算的余额存储在Person实体中。