2011-07-28 30 views
0

我很難對我的應用數據建模以獲得合理的性能。如何在Google App Engine數據存儲中爲我的應用建模

它是跟蹤一羣人,今天之內的費用,我有以下實體的應用程序:

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) 

問題是,當我如要計算差額每個人,那我也以獲得通過所有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個人,則時間會增加三倍。這些都是不能接受的響應時間。

謝謝!

回答

1

通常你想優化讀取。

不是在讀取時計算個人餘額,而是在寫入時計算變化並反規格化,將計算的餘額存儲在Person實體中。

+0

我最終使用memcache來存儲非規格化的數據並從那裏讀取,這提高了讀取性能。我猜你的解決方案也會起作用,在讀取數據時速度相同,而緩存添加/寫入請求作爲我的內存緩存解決方案,因爲我必須在每次添加/寫入時使特定事件的內存緩存失效。 – thejaz

相關問題