2011-06-10 20 views
6

对于NoSQL,选择特定的NoSQL数据库的选择有很多,如NoSQL wiki中所述。用什么NoSQL数据库来替代MySQL?

在我的应用程序中,我想用NOSQL替换替换mysql。在我的应用程序中,我有用户表,它与大量其他表具有一对多关系。其中一些表又与其他表格相关。另外我有一个用户连接到另一个用户,如果他们是朋友。

我没有要存储的文档,所以这消除了面向文档的NoSQL数据库。 我想要非常高的性能。 NOSQL数据库应该与Play Framework和Scala语言一起使用。 它应该是开源的和免费的。

因此,上面给出了什么NoSQL数据库我应该使用?

回答

1

在这一点上,答案是没有,恐怕。

您不能仅将关系模型与连接转换为键值存储设计,并期望它是1:1映射。从你所说的看来,你确实有连接,其中一些是递归的,即引用同一个表中的另一行。

您可能会先反规范化现有的关系模式,将其移近您希望实现的设计。然后,如果您正在尝试做的事情能够以切实可行的方式完成,并且可以选择哪种技术,则可以更轻松地看到。你甚至可以选择继续使用MySQL。仅仅因为你可以进行连接并不意味着你必须这样做,这使得在像MySQL这样的关系数据库管理系统中有非关系设计成为可能。

另外,请记住 - 非关系数据库是为可伸缩性而设计的 - 不是性能!如果您没有成千上万的用户和服务器群,那么传统的关系数据库实际上可能对您更好。

+2

您在混淆NoSql和键值数据存储。像Graph数据库(Neo4J)和OO数据库(db4o)这样的NoSql数据库不是键值数据存储。他们提供强大的关系机制。 – 2011-06-10 23:32:49

+0

@Vagif:老实说,我真的不喜欢NoSQL这个名字(或者非关系型),因为它定义了它不是什么,而是它是什么。按照相同的推理,我猜这个老式的文件系统可能被称为NoSQL,因为它不是SQL或关系型的。 OTOH,你对图形数据存储是正确的,我没有想到这一点。 – 2011-06-11 16:55:23

+0

那么,我们有无神论者,他们没有什么,而不是他们拥有什么。在一个由宗教无神论主宰的世界里,这是一个有效的定义。在由SQL数据库支配的世界中,我猜NoSql确实有意义。 – 2011-06-11 22:28:06

8

我想你可能会误解“文档数据库”的性质。因此,我会推荐MongoDB,这是一个文档数据库,但我认为你会喜欢它。

MongoDB存储基本上是JSON记录的“文档”。很酷的部分是它了解它存储的文档的内部。因此,考虑一个文件是这样的:

{ 
    "name": "Gregg", 
    "fave-lang": "Scala", 
    "fave-colors": ["red", "blue"] 
} 

你可以在“最喜欢的琅”或“最喜欢的 - 色彩”查询。你甚至可以在这些领域的任何一个上进行索引,甚至是“fave-colors”数组,这就需要在关系土地上有多对多的关系。

Play提供了一个我没有用过的MongoDB插件。您也可以使用Casbah driver for MongoDB,我已经使用了很多并且非常优秀。如果您喜欢MongoDB,那么查询由FourSquare编写的针对MongoDB的DSL的Rogue也值得一看。

MongoDB速度非常快。另外,你可以节省编写模式的麻烦,因为任何记录都可以有你想要的任何字段,而且它们仍然可以搜索和索引。您的数据模型可能看起来很像现在的样子,具有用户“集合”(如表格)和其他具有根据需要引用用户标识的记录的集合。但是,如果您需要为某个集合添加字段,则可以随时执行此操作,而无需担心较旧的记录或数据迁移。技术上MongoDB记录没有模式,但最终会将类似的记录组织到集合中。

MongoDB是我在过去几年遇到的最有趣的技术之一。在那个愉快的星期六,我决定检查一下,在15分钟之内是有成效的,感觉就像我“明白了”。我经常在演示中演示如何在15分钟内开始使用MongoDB和Scala,包括安装MongoDB。这里无耻的插头,如果你到Web服务,是我在开始使用的MongoDB和Scalatra的使用卡斯巴博客文章:http://janxspirit.blogspot.com/2011/01/quick-webb-app-with-scala-mongodb.html

你应该至少是去http://try.mongodb.org

这就是让我开始。

祝你好运!

+0

非常感谢细节。 mongodb可以用于像一个用户对象的关系是另一个用户对象的朋友和一对多关系吗? – ace 2011-06-11 06:58:00

+0

是的,有一种从一个对象链接到另一个对象的通用格式,但您必须自己关注链接。关系数据库中没有连接。 – 2011-06-11 14:19:25

2

嗯,你想要非常高的遍历性能,并使用单词“朋友”。首先想到的是Graph Databases。他们是专门为这个确切的案件。

尝试Neo4j的http://neo4j.org/

它是免费的,开源的,但也有商业支持和商业许可,具有出色的文件,可以从许多语言(REST接口)进行访问。

它是用java编写的,所以你有本地库或者你可以将它嵌入到你的java/scala应用程序中。

+0

感谢您的洞察。你能否告诉我neo4j是否可以免费用于商业用途而不需要我的项目是开源的?这从他们的网站是不明确的。 – ace 2011-06-11 06:55:34

+0

是的。如果应用程序用于公司内部使用,则是免费的。但是,如果您在网上为客户提供服务,那么您必须开放源代码或购买商业许可证。 – 2011-06-11 22:22:43

0

关于MongoDB或Cassendra,您现在(2016年12月,晚5年)尝试longevityframework.org

使用标准Scala习惯用法(如案例类,伴随对象,选项和不可变集合)构建您的领域模型。请告诉我们您的模型中的类型,并提供持久性。

请参阅“More Longevity Awesomeness with Macro Annotations!”从John Sullivan
他提供了一个example on GitHub

如果你以前看过长寿,你会惊讶于开始保持你的域对象变得容易。最好的部分是所有与持久性有关的东西都藏在注释中。您的域类完全没有持久性问题,可以完美地表达您的域模型,并可以在应用程序的所有部分中使用。