在AppEngine中的思考
我正在寻找一些资源,帮助我把传统的关系型数据库设计技能转移到AppEngine的数据存储上(也就是“软模式”风格)。我看过几次演讲,里面提到了大致的主题和一些具体的技巧。
我在想,是否有一个地方可以汇集大家的经验(“来自战壕的经验”),分享在现实世界中如何重新思考数据结构,特别是如何将现有的应用程序迁移过来。我们现在主要使用Hibernate,可能在数据模型上走了一些弯路,导致生成了一些复杂的查询,数据库对此有些吃力。
如果你符合以下条件,请回复:
- 你已经把一个不简单的应用程序迁移到AppEngine上
- 你从零开始在AppEngine上创建了一个常见类型的应用程序
- 你既没有做过1也没有做过2,但正在考虑这样做,并想分享你到目前为止的发现。
4 个回答
非关系型数据库的设计基本上就是尽量避免数据的重复和复杂化。
举个例子:因为BigTable没有足够的聚合功能,所以在传统的关系型数据库中可以用的sum(cash)这个选项在这里是没有的。相反,我们需要把这个总和存储在模型里,并且必须重写模型的保存方法,以计算这个非标准化字段的总和。
一个基本的设计思路是,每个模板都有自己的模型,里面包含了所有需要填充的字段,这些字段在对应的模型中都是非标准化的;而且在模型中会有一整套信号更新和处理的复杂逻辑。
超时设置得很紧,性能还可以但不算特别好,所以我不得不使用额外的空间来节省时间。举个例子,我有一个交易卡和玩家之间的多对多关系,所以我重复存储了拥有关系的信息:卡片对象里有一个玩家列表,而玩家对象里也有一个卡片列表。
通常来说,重复存储所有信息是很傻的(而且容易不同步),但在这种情况下效果很好。
最近在Python中,他们推出了一个远程API,这样你就可以获得一个交互式的数据库控制台,可以随意操作你的数据库,没有超时或限制(比如,你可以删除大量数据,或者重新设计你的模型);这非常有用,因为正如Julien提到的,之前进行大规模操作是非常困难的。
我在想有没有地方可以汇集大家的经验和知识。
有很多Google小组可以用来交流这些内容,不过我不太确定有没有直接和Java-GAE相关的群组——我在GAE的经验主要是用Python(我有点自豪地说,Python的创始人Guido van Rossum,现在在Google的App Engine工作,曾告诉我我教了他一些关于他自己创造的东西的知识——他提到这件事的推荐信是我在LinkedIn上最骄傲的推荐之一;-)。[我在Google工作,但我对App Engine的影响其实很小——我主要负责“构建云”,也就是集群和网络管理软件,而App Engine是为了让这些基础设施对第三方开发者有用。]
确实有很多关于如何优化GAE的扩展性和性能的文章和演示——不过质量参差不齐。目前出版的书籍也一般;接下来几个月会有更多书出版,希望能有更好的(我曾和两个非常厉害的朋友一起计划写一本,但大家都太忙了,最后没能完成)。一般来说,我推荐Google I/O的视频和Google在其App Engine网站和博客上推荐的文章,还有来自appenginefan博客的所有内容——我从appenginefan那里学到了很多关于GAE的知识,Guido称赞我教了他这些东西,部分是通过在帕洛阿尔托的精彩App Engine聚会,他的博客也很棒;-)。