2009-06-14 68 views
11

關係數據庫支持的好處之一是count,sum,avg等聚合函數。但是,似乎如果您使用GAE,插入或更新記錄時,您必須計算並存儲計數,總和,平均值,等等整個表的值。但是如果你有很多有條件的分組呢?給定一個人:有沒有辦法在Google App Engine上執行聚合函數?

class Person { 
    @Id 
    Integer age; 
    String city; 
} 

如果我想

  1. 人 和
  2. 平均年齡

是否糾正每次我創建,更新或刪除總數一個人我也應該計算這兩個聚合並將它們作爲單獨的列存儲在同一個表中。如果我還想要每個城市的總值和平均值,我是否應該將每個城市的這些值也作爲單獨的列存儲在同一個表中?

回答

6

右鍵:要正確使用GAE存儲,您需要選擇性地對模型的某些方面取消規範化,保留「冗餘」數據,這些數據以常規形式存在於數據庫中,您可以即時重新計算,例如聚合(整體和「分組」)。

但是,請不要在您的案例中將這些字段添加到Person表中 - 這沒什麼意義!創建另一個PersonAggregates表,其中包含城市(總計爲空/缺少總數),計數,總時間(更易於維護:隨時計算總計除以計數的平均值)等列。

+0

這聽起來非常昂貴,無論是軟件開發時間還是CPU收費。我不得不認爲谷歌以這種方式進行數據存儲的理由很充分,但我最初的反應是恐怖的。亞歷克斯,什麼是一個好的最佳實踐書或文件,你會把像我這樣的SQL大人物交給? – 2012-06-07 22:30:34

3

對於經常使用的聚合,最好是在每次更新/插入/刪除時更新它們。

如果您還沒有設計這樣的聚集到從一開始你的應用程序,你可以通過Remote DataStore API運行腳本或建立一個服務器端 cron job將處理所有實體和計算總量。這很容易,請記住每個請求的CPU配額。

相關問題