11

关系数据库支持的好处之一是聚合函数,如 count、sum、avg 等。但似乎如果您使用 GAE,在插入或更新记录时,您必须计算并存储 count、sum、avg 等。整个表的值。但是如果你有很多条件分组呢?给定一个人:

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

如果我想要

  1. 总人数和
  2. 平均年龄

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

4

2 回答 2

6

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

但是,不要Person在您的情况下将此类字段添加到表中 - 这没有什么意义!制作另一个PersonAggregates表格,其中包含 City(总体总计为空/缺失)、Count、TotalAges 等列(更易于维护:随时计算平均值,即总计除以计数)。

于 2009-06-14T16:04:40.197 回答
3

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

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

于 2009-06-14T16:22:04.803 回答