【问题标题】:Basic set-based operations using a document database (noSQL)使用文档数据库 (noSQL) 的基本基于集合的操作
【发布时间】:2011-10-06 10:29:09
【问题描述】:

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

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

所以根据我的理解:

  • Union(如在 SQL UNION 中)是非常直接的追加。此外 不同集合之间的联合(SQL JOIN)可以实现map/reduce。这 RavenDB 神话书中给出的示例,注释计数为 博客条目是一个好的开始。
  • 交集可以使用多种技术来执行 反规范化直至创建“映射”或“链接” 文档如here 所述(以及下面的聚合器示例)。在 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 个没有任何标签的项目”。

所以我的问题:

  • 你能告诉我一些关于这件事的阅读材料吗?
  • 您能否分享一些关于如何完成任务的想法 高效

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

【问题讨论】:

    标签: nosql ravendb except complement rdbms


    【解决方案1】:

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

    【讨论】:

    • 考虑到 ravenDB 的一系列变化,这条评论的正确性如何?
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 很遗憾,您的回答并未完全回答问题。您提供的链接是指非常简单的操作。我正在寻找的是一种使用文档存储在两组之间处理“NOT IN”操作(减法或相对补码)的技术。在这个阶段唯一明显的解决方案似乎是通过自定义应用程序代码,这不会完全有效。
    猜你喜欢
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 2011-04-03
    相关资源
    最近更新 更多