2010-04-28 89 views
8

根据Wikipedia NoSQL article,有很多NoSQL实现。要选哪个NoSQL存储

面向文档和键值存储(正如人们最常提到的)有什么区别?

+0

它主要取决于您的需求。 – Htbaa 2010-04-28 13:50:41

+0

这是关于NoSQL的问题,根本不涉及某人的需求。 – 2010-04-28 19:57:14

+0

好吧,根据你的情况,最好的选择会改变,因为它们没有全部相同的功能。您是否需要高度可扩展的解决方案?或者它只是一个小商店?你需要执行搜索吗?或只是通过密钥获取?它大部分是读取?写?都?性能各不相同。因此,这个问题要求你确定你的要求 – 2010-04-28 20:05:01

回答

13

这是我写的一篇博文,Visual Guide to NoSQL Systems,说明了一些最流行的系统之间的主要区别。他们之间最大的区别是他们选择以下两种方式中的哪一种进行优化:一致性,可用性和分区容差。

+1

你可以选择两个的想法是误导性的:http://dbmsmusings.blogspot.com/2010/04/problems-with-cap-and-yahoos-little.html – TTT 2010-05-03 20:36:42

2

在一个层次上,文档和键/值非常相似 - 当你请求一个键时,两者都会返回一个对象。在纯键/值中,对象将是一个简单的字符串,尽管它可以是一个序列化的复杂对象。文档数据库通过函数对这个对象进行扩展,例如部分更新功能或搜索索引。

除此之外,您需要考虑您的特定需求--NOSQL涵盖了很多不同的系统,与SQL数据库不同,它们在特定情况下具有完全不同的优点/缺点。

2

在我看来,我真的不知道Cassandra是如何不一致的。它不能进行一致的更新,但我从来没有与需要更新的数据库模型一起工作,而不是一致的版本化插入(有时称为版本化更新,即使它们不是真正的更新)。 ACID如果你使用你的数据模型ACID,而不是使用数据库事务,那么以银行的方式进行交易,交易不是多重数据变化,而是实际的数据对象。在他们中,他们有交易,而你的账户当前状态是从交易中计算出来的,这些交易不是数据库特征,而是数据模型的一部分,为了保持一致性,他们不需要立即可用于所有节点,因为他们是我mmutable。

我还没有找到使数据不可变的情况不能解决一致性问题的情况。这与将数据模型的事务作为不可变数据的一部分(一次写入多次读取)相结合,满足了ACID要求。

原子 - 作为唯一不可变对象/行的事务成为原子,没有任何复杂的数据库对象来支持它。

一致性 - 可以在数据模型中设计数据库操作或事务,使其一致。所有需要的是它是不可变的(创建后永远不会改变)

隔离 - 一个事务是自己的数据对象,不应该干扰他人,因此是孤立的。

持久性 - 如果事务不可变数据丢失,它相当于将数据库恢复到其以前的状态。如果数据没有丢失,那么它处于事务后状态。在任何一种情况下,它都会满足ACID的耐久性要求。

确实,在“银行”数据模型中无法实现几件事情。您的账户信息不能拥有固定金额的ACID行。虽然交易本身就是ACID,但并不意味着数据依赖于它们。这是因为所有的事务可能还没有从所有节点可见。他们甚至可能在另一家银行的数据库中。因此,您的帐户余额无法达到ACID一致性,但只要所有重要数据具有ACID一致性,就没有理由具备这种要求。

我以银行数据库为例,因为它经常用作关于如何在账户余额上回滚SQL事务的例子 - 在实际实现中永远不会发生的事情......因为银行事务必须支持异步多线程,数据库交易,或换句话说跨银行交易。

您也可以将其与文件系统相关联。 Cassandra(例如)可以为您提供文件不可变快照的一致视图。你不能保证看到最新的快照 - 但是一个快照。这使得它与CVS/SVN或CODA一致。