9

我正处于开发体育统计网站(终极飞盘)的早期阶段,如果 Google App Engine 适合我,我想知道您的意见。

我正在使用 Django 用 Python 编写它,并且多年来一直对标准 RDBMS 感到满意,但这个站点是一个长期项目,我期待大量数据,所以我想要 GAE 数据存储提供的“无限”扩展。对数据库的绝大多数查询将返回非常标准的结果,这将使数据存储看起来像是一个合乎逻辑的选择。但是,我希望将来能够进行极其复杂的查询,以提出新的统计指标或简单地提出有趣的结果。我计划在未来做很多这样的事情,但在收集到数据之前我不会知道这些查询是什么。

例如,你经常会看到棒球统计分析员提出荒谬的统计数据,例如“这只是过去 50 年来,两名姓氏以“Z”开头的左撇子投手背靠背投出一击即停的情况。天”。我希望将来可以灵活地进行任何查询。:)

但是,我的印象是,像 bigtable 这样的非关系数据库需要您事先提出包含冗余数据的模型,并且所有工作都发生在插入而不是提取上。我已经构建了 django 模型,其中几乎包含了我需要查询的所有数据,但我不知道从现在起一两年后我想要什么样的非规范化模型。因此,我觉得将来在 GAE 数据存储上进行复杂查询将非常困难,并且需要我从服务器上提取大量信息,然后再用 python 处理它。

谷歌应用引擎数据存储对于我想做的事情来说是完全错误的吗?或者我只是错过了一些东西。提前非常感谢!

更新: 感谢到目前为止的回复。我意识到我还应该提到很多这些复杂的查询是我希望用户能够执行的查询,因此离线数据库并不是一个真正的选择。例如,用户应该能够看到任何两个特定球员在特定比赛或赛季中同时在场上时的表现的各种统计数据。虽然这些查询不像标准聚合统计那样频繁,但它们仍然会定期发生。

拥有一个关系数据库和 GAE 数据存储会很棒,但是 django 默认不支持多个数据库,并且将解决方案修补在一起听起来既困难又混乱。Eric Florenzano 为两个都使用 django 模型的数据库提供了一个很好的解决方案,但是如果我要使用 GAE 数据存储,我将不得不使用应用程序引擎的 db 模型。在这一点上,像他为这个复杂的问题提出一个很好的解决方案有点超出我的技能水平。

现在,我最喜欢的两个选项是使用 GAE 任务队列来执行困难的查询,或者使用更标准的网络主机(如 webfaction),然后在我的数据增长并且我需要提高性能时对我的表进行非规范化。

4

4 回答 4

13

您所描述的本质上是OLAP - 在线分析处理。OLAP 是“传统”RDBMS 非常擅长的一件事,部分原因在于 SQL 的灵活性和强大功能——而非关系型数据库(如 App Engine 数据存储区)则不然。听起来您的 OLAP 类型的查询与正常访问相比相对较少,所以我建议使用以下两种方法之一:

  • 每隔一段时间将您的所有数据从 App Engine 数据存储区镜像到关系数据库,并对关系数据库执行分析查询。面向用户的流量仍由数据存储提供,因此您可以获得所有优势,但您有一个离线副本,您可以对其执行复杂的查询。
  • 使用 App Engine 的任务队列支持来执行检查大型数据集的查询。您可以用 Python 或 Java 编写查询,然后使用任务队列在一个非常大的数据集上执行它,并在完成后异步获取结果。显然,要使这变得简单,需要一些基础设施工作(尽管请关注我的博客以了解未来涉及此的项目;)。
于 2009-11-10T22:39:03.487 回答
6

由于您提到的原因,我会说 bigtable 类型的存储不太适合统计应用程序。但这是你必须做出的经典权衡。我很少发现自己使用真正复杂查询的灵活性,但很多时候被迫为原本不应该在数据库中的东西提出更专业的解决方案。

如果您坚持使用 RDBMS,则可以相当容易地进行逻辑分区和非规范化,例如通过 Hibernates 持久性策略和Hibernate Shards。如果您可以忍受稍慢的处理,您还可以在 bigtable 类型的存储上执行 SQL 查询(例如参见hadoop pig latin)。

于 2009-11-10T20:16:41.420 回答
2

GAE 数据存储与 RDBMS 完全不同。在关系数据库中很容易编写如下内容:

SELECT STDEV(player_score)
FROM Table
WHERE player_id = 1234
  AND game_date BETWEEN '2007-01-01' AND '2009-11-10'
  AND city <> 'London'

GAE 查询有很多限制——见这里——所以翻译这个并不容易。对于聚合函数(sum、stdev 等),您必须将所有数据拉入应用层并计算或维护在每次数据插入/更新时更新的聚合实体。

更新
您可以考虑将 GAE 用于 UI 和业务逻辑,但在云中的其他地方拥有单独的关系数据库,例如:Microsoft SQL、Amazon 上的 DB2、其他地方的 MySQL——而不是使用 GAE 数据存储来进行预先计算的聚合和统计。所以统计数据仍然在 RDBMS 中计算,但您将结果(部分、预先计算的统计数据)存储在 GAE 存储中;类似于分析多维数据集中的维度存储。

于 2009-11-10T20:32:44.860 回答
0

我想支持 MindWire 关于使用 Google 的 CloudSQL 的参考。

我当前的项目实际上主要从数据存储中工作,并在 Cloud SQL 中执行更多面向 SQL 的任务。

App Engine Python SDK 的参考文档

于 2013-03-09T17:51:08.300 回答