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

3

像大多数人一样,我来自关系型数据库的世界,试图理解noSQL数据库,特别是文档存储(因为我觉得它们最有趣)。

我正在尝试了解如何使用文档数据库执行一些集合操作(我正在使用RavenDB进行实验)。

所以根据我的理解:

  • Union(就像SQL UNION一样)非常简单明了。此外,不同集合之间的联合(SQL JOIN)可以通过map / reduce实现。 RavenDB神话书中关于博客文章评论计数的示例是一个很好的开始。
  • Intersection可以使用许多技术来执行,从反规范化到创建“映射”或“链接”文档,如这里所述(以及下面的聚合器示例)。在关系型数据库中,这将使用简单的“INNER JOIN”或“WHERE x IN”执行。
  • Subtract(相对补集)是我遇到困难的地方。在关系型数据库中,此操作只是一个“WHERE x NOT IN”或一个左连接,其中连接的集合为NULL。

使用现实世界的例子,假设我们有一个RSS聚合器(例如Google Reader),其中有数百万甚至数十亿个RSS条目,每个用户都会标记自己喜欢的内容等。

在这个例子中,我们关注条目,用户和标签;其中标签充当用户和条目之间的链接。

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个回答

2
Amok,非关系型数据库很难轻松地做到您想要的功能。这主要是因为它们不以集合为基础,并且与分布式计算有着紧密的联系。例如,您无法在没有访问所有数据的情况下进行高效的集合操作,这几乎意味着任何基于集合的操作都需要访问所有数据。由于NoSQL数据库通常用于分布式场景,因此它们无法真正支持这一点。特别是 RavenDB 允许对指定的集合执行某些操作,但它基于独立文档的假设构建,这些文档与其他文档没有强烈的关联或需要以相同方式全部操作。

鉴于ravenDB的变化如此频繁,这个评论有多正确? - Andrew Harry

0

很遗憾,您的回答并没有完全回答问题。您提供的链接是关于非常简单的操作。我正在寻找一种使用文档存储处理两个集合之间的“NOT IN”操作(减法或相对补集)的技术。目前唯一明显的解决方案似乎是通过自定义应用程序代码来实现,但这并不完全有效率。 - amok

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