选择哪种NoSQL存储引擎

8
根据维基百科NoSQL文章,有许多NoSQL实现。
文档导向和键值存储(人们最常提到的)有什么区别?

它主要取决于您的需求。 - Htbaa
这是关于NoSQL的问题,与某人的需求无关。 - Little Jeans
根据您的情况,最佳选择会因为它们没有完全相同的功能而改变。您需要一个高度可扩展的解决方案吗?还是只是一个小商店?您需要执行搜索吗?还是只是按键获取?它主要是读取还是写入?性能因一个与另一个而异。因此,问题要求您明确您的要求。 - Stéphane
1
你没有提供任何关于你的需求的信息。这怎么会得到+3呢?他的要求是要知道两者之间的区别。并非所有的需求都是实现特定的。 - jeremyjjbrown
3个回答

13

这是我写的一篇博客文章:《NoSQL系统视觉指南》,阐述了一些最流行系统之间的主要区别。它们最大的不同之处在于它们选择优化哪一项:一致性、可用性和分区容错性。


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

2

在某个层次上,文档数据库和键值数据库很相似-当您请求一个键时,两者都将返回一个对象。在纯键值数据库中,该对象将是一个简单的字符串,尽管它可以是序列化的复杂对象。文档数据库通过添加处理此对象的功能(例如部分更新功能或搜索索引)来扩展其功能。

除此之外,您需要考虑自己的具体需求 - NOSQL涵盖了许多不同的系统,并且与SQL数据库不同,它们对于特定情况具有非常不同的优缺点。


2
在我看来,我真的不明白Cassandra为什么不一致。它不能进行一致性更新,但我从未使用过需要更新的数据库模型,而是使用了一致版本插入(有时即使它们并不真正更新也被称为版本更新)。
此外,如果您使数据模型ACID,则Cassandra可以完全符合ACID。与使用数据库事务不同,以银行的方式执行交易。在那里,交易不是多个数据更改,而是实际的数据对象。
银行账户中没有存款。它们有交易,您的帐户当前状态是从交易计算出来的。这些交易不是数据库功能,而是数据模型的一部分。它们不需要立即对所有节点可用才能保持一致,因为它们是不可变的。
我还没有找到过使数据不可变无法解决一致性问题的情况。结合将交易作为不可变数据的数据模型的一部分(写一次读多次),满足了ACID要求。
原子性 - 交易作为唯一的不可变对象/行,成为原子性,无需任何复杂的数据库对象支持它。
一致性 - 可以在数据模型中设计数据库操作或事务,使其一致。实际上只需要它是不可变的(创建后永远不会更改)。
隔离性 - 不影响其他交易的事务应该是它自己的数据对象,因此是隔离的。
持久性 - 如果交易的不可变数据丢失,则相当于将数据库恢复到其先前状态。如果数据没有丢失,则处于其事务后状态。在任何情况下,都满足ACID的持久性要求。
确实有几件事无法在“银行”数据模型中实现。您的帐户信息不能具有具有固定金额的ACID行。虽然交易本身是ACID的,但这并不意味着依赖于它们的数据也可以是ACID的。这是因为所有交易可能尚未从所有节点可见。它们甚至可能在另一个银行的数据库中。因此,您的帐户余额无法实现ACID一致性,但只要所有重要数据具有ACID一致性,就没有理由要求它具有此类要求-而它确实具有。
我使用银行数据库作为示例,因为它经常被用作如何使用SQL事务进行帐户余额回滚的示例-实际实现中永远不会发生...因为银行交易必须支持异步多数据库交易,或者换句话说,跨银行交易。
您还可以将此与文件系统相关联。 Cassandra(例如)可以为您提供文件的不可变快照的一致视图。您不能保证拥有最新快照的视图-但是一个快照。通过这种方式,它使其与CVS / SVN或CODA一样一致。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接