与大多数人一样,我来自 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 个没有任何标签的项目”。
所以我的问题:
- 你能给我指出一些关于这个问题的阅读材料吗?
- 你能分享一些关于如何有效完成任务的想法 吗?
注意:我知道您会失去使用文档数据库的查询灵活性,但肯定有办法做到这一点吗?