我正在Scala开发一个全新的项目。它只是一堆CRUD操作的应用程序,但是,由于一些古怪的要求,Play2或Lift不符合要求,所以我将从头开始开发应用程序。这意味着Anorm或ScalaQuery成为数据库集成的不太明显的选择,让我有一个问题:是时候尝试新的东西吗?
我过去的技术堆栈主要包括Java和PostgreSQL,我有ORM和纯SQL的经验。像MongoDB这样的NoSQL数据库管理系统是典型RDBMS的良好替代品,还是特殊情况的应用程序数据存储?此外,数据库的选择如何影响更大的Scala系统设计(如果有的话)?例如,您使用类似JSON的接口与数据库进行通信,以及Web和REST服务之间的JSON这一事实并不意味着如果中间的所有内容都成为Scala对象,或者它是什么?
我基本上要求有人从关系数据库转移到对象/文档类型数据库,特别是使用Scala。我知道即将发布的SLICK承诺提供良好的RDBMS集成。因此,如果像TypeSafe这样的公司决定在TypeSafe堆栈中创建一个RDBMS集成部分,那么我是否会使用Casbah集成到MongoDB中游上游?
如果这个问题看起来有点模糊,请道歉。我希望有正确见解或经验的人能够提供帮助。
更新
不向SLICK添加链接的道歉(这是相当新的)。这是:
更新2:
我个人对技术的第一次胜利通常是开发人员的生产力 - 这可以转化为轻量级和简单:快速学习,易于维护,没有魔力
答案 0 :(得分:5)
我目前处于类似情况,由于我在Web开发和SQL数据库方面有一些经验,因此我将其作为与MongoDB,Cashbah(和Scalatra)合作的机会。我的经验仍然非常有限,我正在处理的项目和数据量非常小,但我已经做了一些观察。
对于我拥有的几组数据,性能似乎并没有激发SQL或NoSQL。但是,存在大量数据时的性能通常被列为使用NoSQL的原因,例如by Wikipedia
我的文档(数据库中的条目)来自基准测试套件,并且主要具有静态结构,我乐观地认为我可以将它们存储在固定模式SQL数据库中。但是,一些子结构不是静态的,例如,添加了新的测试用例,跟踪了新的统计数据,删除了其他的。这是我尝试使用无架构NoSQL数据库的主要动机。此外,因为我觉得MongoDB的文档方法使得哪些数据属于一起(即文档)更加明显,与关系数据库中的条目相比,数据将分布在各种表和行中,以及需要通过连接重建完整的“文档”。
Lift-Json或Rogue等工具允许您在类型安全的情况下使用常规Scala对象,尽管数据会定期(反)序列化为(来自)JSON。但是,如果您的数据结构主要是静态的,那么这自然会效果最好,否则,您将使用字符串来访问您的数据(例如,使用Cashbah扩展查询结果)。
如果您主要关注服务器和客户端上数据的连贯表示,那么Opa或Haxe等语言可能会引起关注,因为它们会编译为可以在双方执行的代码。有关“multitarget”或“无级”语言,请参阅this page。
答案 1 :(得分:3)
评论太久了。只是试图将我的短暂经验与Scala联系起来(现在大约6个月了,因为Play2何时问世 - 很快就会成为我的语言)。
我很喜欢在我的最后几个项目中使用Salat / Casbah和MongoDB;大部分都在Play2中,但最新的是没有webapp框架。它绝对不喜欢游泳上游。
我想说有一些特殊的用例,我不会使用mongo,但它可以很好地用作通用对象数据存储,特别是如果你希望通过id或index查询而不需要事务(并且将需要最小的ad-hoc聚合类型的东西)。
期望需要一组专用于mongodb的服务器(或使用专用于mongodb的服务),但我认为这对于大多数严重的数据库应用程序来说都是正常的。
我还使用了Play2 / Anorm,这对于一些特殊的查询仪表板式报表页面来说非常有用。我开始尝试去Squeryl路线,但Anorm似乎更容易用于一次性聚合查询。没有看过SLICK,但听起来很有趣。
答案 2 :(得分:2)
如果不知道您希望应用解决哪些问题,真的很难说。
我个人发现使用NoSQL DB通过REST / JSON提高了工作效率。虽然记住大多数NoSQL DB都提供REST接口,这些接口不需要太多的中间件,Scala或其他,除非你打算用UI编写webapp。
如果这是一个学习练习,我建议你尝试多种方法,因为每个NoSQL DB都有不同的东西可以提供给你的工具包,并亲自发现CouchDB,Riak,Neo4j和MongoDb都有各种优缺点,适合不同的目的。
希望这会有所帮助,祝你好运。