我很难对我的应用程序数据进行建模以获得合理的性能。
这是一个跟踪一群人的成本的应用程序,今天我有以下实体:
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相当高的原因。
问题:
它需要2723ms api cpu只从3个数据存储请求获得293个对象,不是很高吗?实时时间还可以(94毫秒),但它占用了我的api cpu配额很多?
我如何设计它以获得更好的性能?对于上面的例子,今天的实际时间是1863年,但如果有12个人,时间就会增加三倍。
谢谢!
通常情况下,您需要针对读取进行优化。
不是在读取时计算一个人的余额,而是在写入时计算变化并非规范化,将计算的余额存储在person实体中。