使用文档数据库(noSQL)进行基于集合的基本操作

时间:2011-07-15 19:34:52

标签: nosql ravendb except complement rdms

与大多数人一样,我来自RDMS世界,试图了解无数据库数据库,特别是文档存储(因为我觉得它们最有趣)。

我试图了解如何使用文档数据库执行一些基于集合的操作(我正在使用RavenDB)。

按照我的理解:

  • 联盟(如在SQL UNION中)非常直接追加。另外 不同集合之间的联合(SQL JOIN)可以实现map / reduce。该 RavenDB神话书中给出的例子有评论指出 博客条目是一个良好的开端。
  • 交叉可以使用多种技术执行 去标准化直到创建“映射”或“链接” 文档描述为here(以及下面的聚合器示例)。在RDMS中,这将使用简单的“INNER JOIN”或“WHERE x IN”
  • 来执行
  • 减去(相对补充)是我遇到困难的地方。在RDMS中,此操作只是“WHERE x NOT IN”或“LEFT JOIN”,其中连接集为NULL。

使用一个真实世界的例子,假设我们有一个RSS聚合器(例如谷歌阅读器),它有数百万甚至数十亿的RSS条目,有数千名用户,每个标记最喜欢的等等。

在这个例子中,我们专注于入口,用户和标签;其中tag用作用户和条目之间的链接。

user {string id, string name /*etc.*/}
entry {string id, string title, string url /*etc.*/}
tag {string userId, string entryId, string[] tags} /* (favourite, read, etc.)*/

通过上述方法,可以轻松地使用标记执行条目和用户之间的交集。但我无法理解如何进行减法。例如“返回所有没有任何标签的商品”或者更令人生畏的“返回最新的1000件没有任何标签的商品”。

所以我的问题:

  • 你能指点我一些有关此事的阅读资料吗?
  • 您能否分享一些关于如何完成任务的想法 的有效

注意:我知道你在文档数据库方面失去了查询灵活性,但肯定有办法做到这一点吗?

2 个答案:

答案 0 :(得分:2)

横行, 你想要的东西在非关系型数据库中无法轻易完成。 主要是因为他们没有集中思考并且与分布式计算有很强的联系。 例如,如果没有访问所有数据,就无法真正实现高效集,这几乎意味着任何基于集合的操作都必须需要访问所有这些。 由于NoSQL dbs通常用于分布式场景,因此它们无法真正支持它。 具体而言,RavenDB允许对指定集合进行某些操作,但它强烈建立在独立文档的假设之上,与其他文档没有很强的关系,或者需要以相同的方式一起操作的文档。 / p>

答案 1 :(得分:0)

从RDBMS到文档数据库的过渡并不完全顺利,为了使其最佳化,可能需要对模型进行一些重构。这是由于这些技术的不同性质。

重新。 RavenDB中基于集合的操作,请参阅:

http://ayende.com/blog/4535/set-based-operations-with-ravendb

http://ravendb.net/documentation/set-based