哪个NoSQL存储可供选择

时间:2010-04-28 13:47:54

标签: database nosql

根据Wikipedia NoSQL article,有很多NoSQL实现。

面向文档和键值存储之间有什么区别(人们最常提到它们)?

3 个答案:

答案 0 :(得分:13)

这是我写的一篇博文Visual Guide to NoSQL Systems,它说明了一些最受欢迎的系统之间的主要差异。它们之间的最大区别在于它们选择针对以下两个中的哪一个进行优化:一致性,可用性和分区容差。

答案 1 :(得分:2)

在一个级别,文档和键/值非常相似 - 两者都会在您请求密钥时返回一个对象。在纯键/值中,该对象将是一个简单的字符串,尽管它可以是一个序列化的复杂对象。文档数据库使用函数来扩展它,以使用此对象,例如部分更新功能或搜索索引。

除此之外,您还需要考虑您的具体要求 - NOSQL涵盖了许多不同的系统,与SQL数据库不同,它们在特定情况下的优缺点也各不相同。

答案 2 :(得分:2)

在我看来,我并没有真正看到卡桑德拉是如何不一致的。它无法进行一致的更新,但我从未使用过需要更新的数据库模型,而不是一致的版本化插入(有时称为版本化更新,即使它们不是真正的更新。

如果您制作数据模型ACID,Cassandra也可以完全是ACID。不像使用数据库事务那样,按照银行的方式进行交易。在那里,事务不是多项数据更改,而是实际数据对象。

银行账户中没有钱。他们有交易,您的账户当前状态是根据交易计算的。此类事务不是数据库功能,而是数据模型的一部分。它们不需要立即可用于所有节点以保持一致,因为它们是不可变的。

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

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

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

隔离 - 执行的事务是它自己的数据对象不应该干扰其他事务,因此是隔离的。

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

“银行”数据模型确实无法实现多项功能。您的帐户信息不能包含固定金额的ACID行。虽然事务本身是ACID,但并不意味着依赖于它们的数据可以。这是因为所有节点都可能无法看到所有事务。他们甚至可能在另一家银行数据库中。因此,您的帐户余额无法实现ACID一致性,但只要所有重要数据都具有ACID一致性,它就没有理由拥有这样的要求 - 它就是这样。

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

您还可以将其与文件系统相关联。 Cassandra(例如)可以为您提供文件不可变快照的一致视图。您不能保证拥有最新快照的视图 - 但是快照。有了它,它就像CVS / SVN或CODA一样。