2011-05-16 42 views
2

这个问题是相当假设的,但我会问。假设你使用Play开始一个项目,并使用mysql数据库。稍后,您决定要将应用程序移至Google App Engine或Amazon EC2之类的应用程序。或者甚至可以切换到像MongoDB或Cassandra这样的NoSQL数据库。更改Java项目的数据库类型?

有没有这方面的工具?或者你基本上需要重写你的模型?特别是因为mysql是一个关系数据库,与Monogo之类的东西没有任何关系,我猜这很难吗?我在问,因为当你开始一个项目时,很明显,你可能希望在某一时刻扩展你的应用程序,也许你会需要像Mongo这样的东西,但你永远不知道结果如何。很长一段时间,MySQL最终可能会满足您的需求。那么为什么要学习与Mongo一起工作的麻烦,当你用MySQL更高效时,如果有必要,你可以稍后切换?

我更具体地要求结合使用Play!框架。

你的想法是什么?

回答

3

我们有这方面的经验(从GAE到DB)。我不会推荐切换。永远。原因是多方面的:

  • 锡耶纳,虽然这是一个非常酷的想法,它有一个很大的问题:它试图合并两个完全不同的世界。 GAE的工作方式与关系数据库非常不同。这意味着要在两个世界中工作,图书馆必须做一些假设并隐藏一些功能。曾听说过leaky abstractions?是的,锡耶纳作为一个创意非常酷,但不,它不是你想要的一个中大项目。

  • NoSQL和关系数据库的目标非常不同。每种方法都有使用情况,您可能希望使用SQL方法,而在其他方面,NoSQL方法会更好。试图做任何事情都可能是错误的方法/设计

  • 通过使用NoSQL,以防万一您可能会启动root of all evil。说实话:银行已经将SQL机器用于非常繁重的事务性负载并且没有问题。而且我没有将Memcache添加到方程中。也没有SQL优化,也没有代码分析。

    如果您的网站会达到这个级别的流量,非常适合您!但最有可能的是,您将获得资金按需扩展数据库(或者您的网络将会破产)。如果它达到了需要扩展更多的点,那么你总是可以添加一个MongoDb/Cassandra/etc图层来存储你可能想要在那里存储的信息(关系图和其他类似的东西)。但是在那之前你不需要它,现在你可能会在RAM中拥有完整的分贝。不要担心可扩展性,它会很快:)

+0

很好的答案,谢谢! – networkprofile 2011-05-16 14:32:33

+0

不客气 – 2011-05-16 14:44:43

+0

这是一个很好的答案。它表明关系意味着ACID和NoSQL以特定的原因付出代价。理解这些很重要。 – duffymo 2011-05-16 14:59:56

2

虽然没有保证,但您可以采取的一项保护措施是在设计良好的界面后面隐藏持久性实施细节。它不会阻止您在切换时重写实现,但它会将客户端与变更隔离开来。如果您使用依赖注入引擎,您将能够分别测试实现并以声明方式将它们交换进出。

4

已经有一个针对这个用例的解决方案:为Mysql/Postgres/H2编码,并在GAE(以及其他NoSQL DB,如Hbase,sdb,mongo)中使用相同的代码并返回。这是一个名为Siena的项目,已经与Play整合。这是一个轻量级的对象映射框架,基于活动记录设计桥接(至少尝试)SQL/NoSQL。
网站是http://www.sienaproject.com(目前的doc与中继代码相比有点过时和不完整,因为我们处于重构和增强的深度阶段 - 代码非常稳定,它在github上,但真正的中继线不是主要项目,但叉http://github.com/mandubian/siena)。
Play中有2个模块叫做play-siena和crudsiena,你可以在http://www.playframework.org/modules找到。目前的版本只提供GAE支持,但支持MySQL/Postgres/H2 + GAE的版本即将推出(我正在测试它)!

我是锡耶纳的首席开发人员,所以不要犹豫,问我关于它的问题。
不要犹豫,加入谷歌组与我们讨论:http://groups.google.com/group/siena-discuss

问候
帕斯卡尔

+0

我会看看,谢谢!所以基本上锡耶纳是用于数据库抽象? – networkprofile 2011-05-16 13:52:49

+0

是的,人们可以将它看作是一个数据库抽象,但它并不是为数据库抽象而设计的。它被设计成一个实用的对象持久化框架,当你开发一个应用程序,特别是一个Web应用程序时,它提供了有用的API来存储你的结构化数据。所以我们试图从用户需求到数据库而不是其他方式。 – mandubian 2011-05-16 14:03:34

+0

当您针对SQL或NoSQL运行代码时,我们尝试提供相同的行为。当然,对于非常特殊的情况,有一些限制,因为这两种类型的数据存储在不同情况下都有优点和缺点(甚至在SQL DB之间也有差异)。无论如何,看起来差异不是那么大,在绝大多数情况下,SQL和NoSQL都可以做到这一点,对于其他情况,我们试图提供最好的折衷方案(如果可能的话)仔细研究每个数据库特征。基本上,这是一个非常实用且面向用户的方法。 – mandubian 2011-05-16 14:06:56

2

虽然有可能转化应用为MySQL编写一些NoSQL的工具工作,你用的方法关系数据库的效率与您使用NoSQL的方式没有任何相同之处。转换后的应用程序效率非常低,并且数据量足以证明NoSQL解决方案的合理性 - 可能根本无法使用。

+0

因此,重写模型(假设您使用的是MVC模式)是最好的方法吗? – networkprofile 2011-05-16 13:51:51

+1

如果我遇到这种情况,首先要学习使用特定NoSQL解决方案的最佳实践,并考虑将差异封装在DAO层中的方法。在过去的12-18个月中,我一直在与Hadoop/HBase数据仓库和Oracle数据仓库合作。现在我可以看到这些方法是如何不同以及它们可以有什么共同之处。我的下一个项目将从甲骨文开始,同时关注30倍以上的其他客户可能的Hadoop/HBase转换。我希望我会有机会证明/反驳我迄今为止的理论思考;-) – Olaf 2011-05-16 14:01:34