像大多数人一样,我来自关系型数据库的世界,试图理解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个没有任何标签的项目”。
所以我的问题是:
- 你能否为我指点一些相关的阅读材料? - 你能分享一些关于如何高效完成任务的想法吗?
注意:我知道文档数据库会失去查询灵活性,但肯定有一种方法可以做到这一点吧?