使用GAE数据存储区的复杂查询

Spi*_*ike 9 django google-app-engine database-design non-relational-database google-cloud-datastore

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

我使用Django在Python中编写它并且已经习惯了标准的RDBMS多年,但是这个站点是一个长期项目,我期待非常大量的数据,所以我希望GAE数据存储提供"无限"的扩展.绝大多数对数据库的查询都会返回非常标准的结果,这会使数据存储看起来像是一个合理的选择.但是,我希望将来能够提出极其复杂的查询来提出新的统计指标,或者只是想出有趣的结果.我计划将来做很多这样的事情,但是在收集数据之前不会知道这些查询是什么.

例如,你经常看到棒球统计分析师提出荒谬的统计数据,例如"这是过去50年来第一次两名左手投手,其姓氏以'Z'开头,连续投出一击天".我希望将来能够灵活地提出任何疑问.:)

但是,我认为像bigtable这样的非关系型数据库需要您预先提供包含冗余数据的模型,并且所有工作都在插入而不是提取上进行.我已经构建了几乎包含我需要查询的所有数据的django模型,但是我不知道从现在开始我想要一年或两年的非规范化模型.因此,我觉得在GAE数据存储区中进行复杂查询将是非常困难的,并且需要我在python中处理它之前从服务器上提取大量信息.

谷歌应用引擎数据存储是否完全错误,我想做什么?或者我只是缺少一些东西.非常感谢提前!

更新: 感谢目前为止的回复.我意识到我还应该提到很多这些复杂的查询是我希望用户能够做的查询,因此使得脱机数据库不是一个真正的选择.例如,用户应该能够看到各种特定玩家在特定游戏或季节期间同时在场上时的比赛的各种统计数据.虽然这些查询不像标准聚合统计数据那样频繁,但它们仍然会定期发生.

拥有关系数据库以及GAE数据存储区会很棒,但django默认情况下不支持多个db,并且一起修补解决方案听起来很困难而且很混乱.Eric Florenzano 为使用django模型的两个数据库提供了一个很好的解决方案,但如果我使用GAE数据存储区,我将不得不使用app引擎的db模型.并且提出了一个很好的解决方案,就像他为这个复杂问题所做的那样,在这一点上有点超出我的技能水平.

现在我最喜欢的两个选项是使用GAE任务队列来执行困难的查询,或者使用像webfaction这样的更标准的webhost,然后在我的数据增长后再对我的表进行非规范化,我需要提高性能.

Nic*_*son 13

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

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


Ale*_*ing 6

我想说bigtable-type存储不太适合统计应用程序,原因就在于你提到的原因.但这是你必须做出的经典权衡.我很少发现自己使用了非常复杂的查询的灵活性,但是很多时候都被迫为那些本来不应该在db中的东西提出更专业的解决方案.

如果您坚持使用RDBMS,则可以通过Hibernates持久性策略和Hibernate Shards轻松地进行逻辑分区和非规范化.如果你可以忍受稍微慢一点的处理,你也可以在bigtable类型的存储上进行SQL查询(参见例如hadoop pig latin).