谷歌应用引擎上是否有进行聚合函数的方法?

11

关系型数据库支持的聚合函数如count,sum,avg等功能很方便。但如果你使用GAE,在插入或更新记录时,必须计算并存储整个表的计数、总和、平均值等值。但是,如果你有许多条件分组怎么办?给定一个人:

class Person {
    @Id
    Integer age;
    String city;
}
如果我想要:
1. 总人数 2. 平均年龄
那么,每次我创建、更新或删除一个人时,是否应该计算这两个聚合值,并将它们作为单独的列存储在同一张表中?如果我还想获取每个城市的总人数和平均年龄,是否也应该将这些值作为单独的列存储在同一张表中?
2个回答

6
为了正确使用GAE存储,您需要选择性地对模型的某些方面进行反规范化处理,保留“冗余”的数据,在正常情况下,在规范形式的数据库中,您会重新计算这些数据,例如聚合数据(总体和按组分组的数据)。
但是,在您的情况下,请不要向Person表添加此类字段 - 那没有什么意义!请创建另一个PersonAggregates表,其中包括列,例如City(对于总计为null /缺失),Count,TotalAges(易于维护:随时通过总数除以计数来计算平均值)。

这听起来非常昂贵,无论是在软件开发时间上还是CPU费用上。我必须认为Google之所以以这种方式处理数据存储是有充分理由的,但我的初始反应是恐惧的。Alex,你会向像我这样SQL-heavy的人推荐哪些最佳实践书籍或文档? - JD.
非常好的问题,我很高兴看到我选择了一个良好的方法来创建聚合类型。但是,正如@JD所说,实现这种聚合可能会很昂贵且容易出错。我还没有找到适用于此的属性(类似totalAge = db.AggregateProperty(of=Person.age))。你认为最好的方法是什么? - rds

3

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

如果你一开始没有在应用程序中设计这样的聚合数据,你可以通过Remote DataStore API运行脚本,或者设置一个服务器端的定时任务来处理所有实体并计算聚合数据。这非常容易,只需要注意每个请求的CPU配额。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接