有没有办法在Google App Engine上进行聚合功能?

时间:2009-06-14 15:46:51

标签: google-app-engine aggregate-functions

关系数据库支持的一个好处是聚合函数,如count,sum,avg等。但似乎如果你使用GAE,在插入或更新记录时你必须计算和存储计数,总和,平均值等整个表的值。但是如果你有很多条件分组怎么办?鉴于一个人:

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

如果我想要

  1. 总人数 和
  2. 平均年龄
  3. 每次创建,更新或删除某人时,我都应该计算两个聚合并将它们作为单独的列存储在同一个表中,这是正确的吗?如果我还想要每个城市的总价值和平均值,我是否应该将每个城市的这些值也存储在同一个表中的单独列中?

2 个答案:

答案 0 :(得分:6)

正确:要正确使用GAE存储,您需要有选择地对模型的某些方面进行反规范化,保留“冗余”数据,这些数据在正常形式的数据库中,您可以即时重新计算,例如聚合(整体和“分组”)。

但是,不要在你的案例中将这些字段添加到Person表中 - 这没有多大意义!制作另一个PersonAggregates表,其中包含City(整体总数为null /缺失),Count,TotalAges(更容易维护:随时计算总数除以计数)。

答案 1 :(得分:3)

对于经常使用的聚合,最好是在每次更新/插入/删除时更新它们。

如果您从一开始就没有将这样的聚合设计到您的应用程序中,您可以通过Remote DataStore API运行脚本或设置服务器端 cron job将处理所有实体并计算聚合。这很容易,请记住每个请求的CPU配额。