【问题标题】:Is there a way to do aggregate functions on Google App Engine?有没有办法在 Google App Engine 上做聚合函数?
【发布时间】:2009-06-14 15:46:51
【问题描述】:

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

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

如果我愿意

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

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

【问题讨论】:

    标签: google-app-engine aggregate-functions


    【解决方案1】:

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

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

    【讨论】:

    • 这听起来非常昂贵,无论是软件开发时间还是 CPU 费用。我不得不认为 Google 以这种方式处理数据存储是有充分理由的,但我最初的反应是恐惧。 Alex,有什么好的最佳实践书籍或文档可以推荐给像我这样的 SQL 重度用户?
    • 很好的问题,我很高兴看到我选择了一个很好的方法,为聚合创建了一种。然而,正如@JD 所说,实现这种聚合可能会很昂贵且容易出错。我还没有找到适合这个的属性(类似于totalAge = db.AggregateProperty(of=Person.age)。你认为最好的方法是什么?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-01-15
      • 2019-01-17
      • 1970-01-01
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      • 2020-07-04
      • 2011-07-18
      • 1970-01-01
      相关资源
      最近更新 更多