关系数据库支持的一个好处是聚合函数,如count,sum,avg等。但似乎如果你使用GAE,在插入或更新记录时你必须计算和存储计数,总和,平均值等整个表的值。但是如果你有很多条件分组怎么办?鉴于一个人:
class Person {
@Id
Integer age;
String city;
}
如果我想要
每次创建,更新或删除某人时,我都应该计算两个聚合并将它们作为单独的列存储在同一个表中,这是正确的吗?如果我还想要每个城市的总价值和平均值,我是否应该将每个城市的这些值也存储在同一个表中的单独列中?
答案 0 :(得分:6)
正确:要正确使用GAE存储,您需要有选择地对模型的某些方面进行反规范化,保留“冗余”数据,这些数据在正常形式的数据库中,您可以即时重新计算,例如聚合(整体和“分组”)。
但是,不要在你的案例中将这些字段添加到Person
表中 - 这没有多大意义!制作另一个PersonAggregates
表,其中包含City(整体总数为null /缺失),Count,TotalAges(更容易维护:随时计算总数除以计数)。
答案 1 :(得分:3)
对于经常使用的聚合,最好是在每次更新/插入/删除时更新它们。
如果您从一开始就没有将这样的聚合设计到您的应用程序中,您可以通过Remote DataStore API运行脚本或设置服务器端 cron job将处理所有实体并计算聚合。这很容易,请记住每个请求的CPU配额。