NoSQL的使用场景

147
最近我们的行业中,NoSQL引起了很多关注。我非常想知道人们对其应用场景的看法,以及相比关系型数据库存储,何时应该选择NoSQL解决方案。什么情况会促使开发人员认为特定数据集更适合使用NoSQL?我特别关注MongoDBCouchDB,因为它们似乎在PHP开发领域获得了最广泛的覆盖,并且这是我的专注点。

6
Cassandra和MongoDB是完全不同的产品 - 完全不同的类别。如果这个问题询问一个特定类型的数据库(OODB、DODB、DKVS等)的用例,那么回答会更容易些。 "NoSQL"只是一个"不是SQL的任何东西"的总称 - 它也可能是像BerkleyDB这样的东西,或者是一堆平面文件坐落在网络共享上。 - Aaronaught
@Aaronaught 我很欣赏这些差异,我想我可能有点滥用 NoSQL 这个总称。 - robjmills
9个回答

86

承诺自己永远不要试图将关系型数据模型映射到NoSQL数据库,例如MongoDB或CouchDB...这是评估新兴技术时开发人员最常犯的错误。

这种方法类似于将汽车用来拉你的马车,而不是用马匹。

当然,这是一种自然的反应,因为每个人都有自己的经验,但使用文档数据库的真正价值在于能够简化数据模型并减少作为开发人员所遭受的痛苦。您的代码库将变小,错误也会更少且易于找到,性能将非常出色,扩展性也会简单得多。

作为Joomla创始人,我有偏见 :-) 但从CMS空间来看,像MongoDB这样的东西就像是银弹,因为内容很自然地映射到文档系统中。

MongoDB的另一个优点是实时分析,因为它具有非常强的性能和规模,特别是在并发方面。 MongoDB.org网站上有展示这些特性的案例研究。

我同意每个数据库都有其自身的目标和用例,根据用例进行评估。


1
真正地说,spacemonkey说得很好,我和seengee处于同样的位置,显然我们需要以新的方式思考,并且应该问自己如何将应用程序数据组织成文档结构,在进行这种分析时摆脱关系数据库系统的思维方式。 - on_

50

14

10

我已经在使用NoSQL数据库一段时间了,这是我对这个主题的贡献:

NoSQL数据库的一个很好的用例是用于统计和/或报告生成的应用程序, 尤其是当数据来自第三方来源时。

在这种情况下,NoSQL数据库可以是一个不错的选择

让我们以MongoDB为例:

一旦您的数据以JSON格式存在(它可以来自第三方API,也可以从SQL应用程序中导出),在MongoDB中导入并更新JSON数据非常容易;例如使用命令行mongoimport实用程序。

此时,非常简单地使用过滤和分组构建动态查询,与这种类型的应用程序非常契合。例如,使用Aggregation Framework

$pipeline = [];

//filter by date
$pipeline[] = [ '$match' => [ 'created_at' => [ '$gte' => $starDate, '$lte' => $endDate ]  ]  ];

//if we want to filter by a specific field, we add the filter to the pipeline array
if( $filters->isFilterByField() )
    $pipeline[] = [ '$match' => [ 'field' => $fieldValue ] ];    

//group the results by date and get the count
$pipeline[] = [ '$group' => [ '_id' => '$created_at', 'num_elements' => [ '$sum' => 1 ] ] ];

return $collection->aggretate( $pipeline );

我想强调使用PHP数据结构可以轻松地动态添加/删除过滤器,避免繁琐的字符串连接来构建查询语句。采用这种方法,动态添加/删除过滤器就像从数组中添加/删除元素一样容易。

另一个巨大的好处是,这样的解决方案比使用关系型数据库更快,因为我们不需要与不同表进行联接以获取所需的所有数据。

此外,这种用例非常理想,因为它避免了NoSQL数据库的所有主要限制:

  • 缺乏事务:应用程序只执行读取操作而不是写入操作,因此我们根本不需要事务

  • 表之间缺少联接:我们不需要联接,因为我们可以使用冗余存储我们的去规范化数据集合,由于我们只读取数据,因此无需担心在更新时同步去规范化数据。

这样,我们可以专注于以适合我们的查询的方式使用冗余存储数据,这些查询将专注于单个集合。

我写这篇文章只是因为如果我早些时候读到类似的内容,就可以节省一些时间进行研究。

希望对某人有用。


7

我喜欢NoSQL的原因与性能无关,而是与可用性有关。当您的原子数据单位类似于文档时,文档存储只是更容易处理,因为将对象序列化和反序列化是微不足道的。这只是更有趣,这对于个人或副业项目来说是一个重要因素。


1
我不会完全说这是“琐碎的”,但这对于面向文档的数据库来说是一个好观点。对于其他一些NoSQL产品来说,情况实际上恰恰相反 - DKVSes往往比SQL /关系型数据库更难映射。 - Aaronaught

4
首先,你需要理解CAP(一致性、可用性和分区容错性)理论和我们的业务用例。MongoDB满足一致性和分区容错性,并且Couch DB满足可用性和分区容错性。
关于NoSQL的Edureka视频是一些最好的视频教程。
slideshare.net上提供了很好的演示文稿。 https://www.youtube.com/watch?v=gJFG04Sy6NY https://www.youtube.com/watch?v=KSq6tMMXZ8s https://www.youtube.com/watch?v=3z1KFA2qcSo http://www.slideshare.net/quipo/nosql-databases-why-what-and-when?qid=3bb9f7f6-a53d-41b1-8403-cd6f181d0ca7&v=qf1&b=&from_search=1 http://www.slideshare.net/EdurekaIN/no-sql-databases-35591065?qid=f1b9c095-6d70-4d0a-91da-1df664c4f389&v=qf1&b=&from_search=3 (此演示文稿支持YouTube视频教程)

4
我强烈推荐马丁·福勒(Martin Fowler)的这个演讲:https://www.youtube.com/watch?v=qI_g07C_Q5I
摘要: 马丁迅速介绍了NoSQL数据库:它们的起源、使用的数据模型的性质以及您必须考虑一致性的不同方式。从此,他概述了在什么情况下应该考虑使用它们,为什么它们不会使关系型数据库过时,以及多语言持久性的重要后果。
这个演讲很好地阐述了NoSQL是什么,不同的类别以及从关系型数据库世界来时每个人都必须理解的事情。祝好!

明白了,将来会牢记在心。 - user3631881

1

由于市场上现在有比以往更多的NoSQL数据库,因此如果您正在寻找一个适用于企业应用程序的数据库,建议查看Gartner魔力象限图,以评估支持、可扩展性、管理和成本等方面。

http://www.gartner.com/technology/reprints.do?id=1-23A415Q&ct=141020&st=sb

我建议那些还没有尝试过Couchbase的人使用它,但不要基于报告中显示的版本(2.5.1),因为它已经落后于CB Server今天的近两个版本,接近于在2015年下半年发布4.0版。

http://www.couchbase.com/coming-in-couchbase-server-4-0

Couchbase作为供应商/产品的另一部分是它是一种多用途类型的数据库。它可以作为纯键值存储,具有多维缩放的文档导向数据库,Memcached,带持久性的缓存以及支持ANSI 92兼容SQL的自动连接,只需按下按钮即可将数据复制到DR群集,并且甚至内置了移动组件到生态系统中。
如果没有其他任何东西,查看最新基准测试也是值得的:

http://info.couchbase.com/Benchmark_MongoDB_VS_CouchbaseServer_HPW_BM.html http://info.couchbase.com/NoSQL-Technical-Comparison-Report.html


1

对于某些用例,特别是分析查询,您可以使用这个包装器从Postgres运行SQL查询来查询MongoDB。


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