使用基于文档的nosql(mongodb,couchdb和riak等)查询关系数据的性能

前端之家收集整理的这篇文章主要介绍了使用基于文档的nosql(mongodb,couchdb和riak等)查询关系数据的性能前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
为了跟进我在 modeling relational data with nosql的问题,我已经阅读了几篇关于这个主题文章

Nosql doesn’t mean non-relational

Nosql Ecommerce Example

他们似乎建议nosql可以处理规​​范化的关系数据.

因此,让我们继续我之前的例子,一个CMS系统,它有两种类型的数据:文章和作者,其中文章有作者的引用(通过ID).

以下是系统需要支持的操作:

>通过id和作者一起获取文章
>获取特定作者的所有文章
>查找按创建日期排序的作者的前10篇文章

如果相同的数据存储在RDBMS上,我想了解这些操作的性能.特别是,请指定操作是否使用MapReduce,需要多次访问nosql商店(链接),或pre-join

我想限制讨论基于文档的nosql解决方案,如mongodb,couchdb和riak.

编辑1:

Spring-data project对Riak和Mongodb来说是可用的

对于MongoDB,您不会将嵌入文档用于作者记录.因此,预加入已经结束,它是多次访问数据库.但是,您可以缓存作者,只需要为每条记录进行一次第二次旅行.您指出的查询在MongoDB中非常简单.
var article = db.articles.find({id: article_id}).limit(1);
var author = db.authors.find({id: article.author_id});

如果您使用ORM / ODM来管理应用程序中的实体,这将是透明的.这将是两次到数据库的旅行.他们应该是快速的反应,两个命中应该是不明显的.

寻找作者的文章只是反过来……

var author = db.authors.find({id: author_name}).limit(1);
var articles = db.articles.find({author_id: author.id});

所以,两个查询,但单个作者提取应该很快,可以很容易地缓存.

var articles = db.articles.find({}).sort({created_at: 1}).limit(10);
var author_ids = articles.map(function(a) { return a.author_id });
var authors = db.authors.find({id: { '$in': authors_ids }});

最后,再次,但只是一点点复杂.您可以在mongo shell中运行它们以查看结果可能是什么样的.

我不确定这是值得写一个地图减少完成.几次快速往返可能会有更多的延迟,但mongo协议非常快.我不会过分担心它.

最后,这样做的实际性能影响……理想情况下,您只需要查询文档中的索引字段,它应该非常快.唯一的额外步骤是获取其他文档的第二次往返,具体取决于您的应用程序和数据库的结构,这可能不是什么大问题.您可以告诉mongo仅查看超过给定阈值的查询(默认情况下打开时默认为100或200毫秒),这样您就可以随时关注数据增长时花费的时间.

你在这里有一个RDMS不提供的装备更容易分解数据.当您将应用程序扩展到CMS之外以支持其他内容但使用相同的身份验证存储时会发生什么?它恰好是一个完全独立的DB,它在许多应用程序中共享.跨dbs执行这些查询要简单得多 – 使用RDMS存储它是一个复杂的过程.

我希望这可以帮助您进行Nosql发现!

猜你在找的NoSQL相关文章