加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 13:55:19 所属栏目:百科 来源:网络整理
导读:为了跟进我在 modeling relational data with nosql的问题,我已经阅读了几篇关于这个主题的文章: Nosql doesn’t mean non-relational Nosql Ecommerce Example 他们似乎建议nosql可以处理规??范化的关系数据. 因此,让我们继续我之前的例子,一个CMS系统,它
为了跟进我在 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发现!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读