NoSQL最近在我们的行业中受到了很多关注.我真正感兴趣的是关于人们对关系数据库存储使用的最佳用例的看法.什么应该引发开发人员认为特定数据集更适合NoSQL解决方案.我对MongoDB和CouchDB特别感兴趣,因为他们似乎在PHP开发方面获得了最多的报道,这是我的重点.
只是承诺你永远不会尝试将关系数据模型映射到像MongoDB或CouchDB这样的NoSQL数据库......这是开发人员在评估新兴技术时最常犯的错误.
这种方法类似于驾驶汽车并试图用它将马车像马一样拉下马路.
当然,由于每个人的经验,这是一种自然反应,但使用文档数据库的真正价值在于能够简化您的数据模型并最大限度地减少您作为开发人员的痛苦.您的代码库将缩小,您的错误将更少,更容易找到,性能将是非常棒的,并且规模将更加简单.
作为Joomla创始人,我有偏见:-)但是来自CMS空间,像MongoDB这样的东西是一个银弹,因为内容非常自然地映射到文档系统.
MongoDB的另一个很好的例子是实时分析,因为MongoDB具有非常强大的性能和扩展性,特别是在并发性方面.MongoDB.org网站上的案例研究证明了这些属性.
我同意每个数据库都有自己的目标和用例的观点; 以相应的方式对每个数据库进行评估.
MongoDB网站上提到了MongoDB的一些很好的用例.给出的示例是实时分析,记录和全文搜索.这些文章非常值得阅读http://www.mongodb.com/use-cases
还有一个伟大的写了上的NoSQL数据库是最适合哪种类型的项目:http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis
我建议Rick Cattell撰写关于杂项数据存储(又名NoSQL)的文章,它们的差异以及它们的一些用例:http://www.cattell.net/datastores/index.html
我喜欢NoSQL与性能无关,与可用性有关.当原子数据单元类似于文档时,文档存储更容易使用,因为在对象之间进行序列化很容易.它更有趣,这是个人或侧面项目的重要因素.
我一直在使用NoSQL DB一段时间了,这是我对该主题的贡献:
NoSQL数据库的一个很好的用例是用于统计和/或报告生成的应用程序,尤其是当数据来自第三方源时.
在这种情况下,NoSQL数据库可能是一个很好的选择
让我们考虑一下MongoDB:
一旦你有了JSON中的数据(它可能来自第三方API,或者从sql-application导出),MongoDB中的数据就非常明了,可以导入和更新数据库中的JSON 数据.例如,使用命令行mongoimport
实用程序
此时使用过滤和分组构建动态查询非常简单,非常适合这种应用程序.
例如,使用聚合框架:
$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 );
我想指出了容易使我们可以dinamically添加/删除过滤器使用PHP数据结构,避免繁琐的字符串连接来建立我们的查询.使用这种方法,在dinamycally添加/删除过滤器就像从阵列中添加/删除元素一样简单
另一个很大的好处来自于这样的解决方案可能比使用关系数据库更快,我们必须使用不同的表进行连接以获取我们需要的所有数据
此外,这个用例是最佳的,因为避免了NoSQL数据库的所有主要限制:
缺少事务:应用程序不执行写操作但只读取,因此我们根本不需要事务
表之间缺少连接:我们不需要连接,因为我们可以使用冗余将非规范化数据存储在集合中.由于我们只读取数据,因此我们不必担心在更新之间同步非规范化数据.
通过这种方式,我们可以专注于以适合我们查询的方式存储冗余数据,这将集中在单个集合上.
我只是写这篇文章是因为如果我以前读过这样的东西,那本可以节省一些时间来进行研究
希望它对某人有用