3

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

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

所以根据我的理解:

  • 联合(如在 SQL UNION 中)是非常直接的追加。此外,不同集合之间的联合(SQL JOIN)可以实现映射/减少。RavenDB 神话书中给出的例子是博客条目上的评论计数是一个好的开始。
  • 可以使用多种技术执行交叉,从反规范化到创建“映射”或“链接”文档,如此处所述(以及下面聚合器示例)。在 RDMS 中,这将使用简单的“INNER JOIN”或“WHERE x IN”来执行
  • 减法(相对补码)是我卡住的地方。在 RDMS 中,此操作只是“WHERE x NOT IN”或“LEFT JOIN”,其中连接集为 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 个没有任何标签的项目”。

所以我的问题:

  • 你能给我指出一些关于这个问题的阅读材料吗?
  • 你能分享一些关于如何有效完成任务的想法

注意:我知道您会失去使用文档数据库的查询灵活性,但肯定有办法做到这一点吗?

4

2 回答 2

2

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

于 2011-07-19T10:16:32.707 回答
0

从 RDBMS 到文档数据库的转换并非完全顺利,可能需要对模型进行一些重构以使其达到最佳状态。这是由于这些技术的不同性质。

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

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

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

于 2011-07-16T22:58:14.537 回答