与大多数人一样,我来自RDMS世界,试图了解无数据库数据库,特别是文档存储(因为我觉得它们最有趣)。
我试图了解如何使用文档数据库执行一些基于集合的操作(我正在使用RavenDB)。
按照我的理解:
使用一个真实世界的例子,假设我们有一个RSS聚合器(例如谷歌阅读器),它有数百万甚至数十亿的RSS条目,有数千名用户,每个标记最喜欢的等等。
在这个例子中,我们专注于入口,用户和标签;其中tag用作用户和条目之间的链接。
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件没有任何标签的商品”。
所以我的问题:
注意:我知道你在文档数据库方面失去了查询灵活性,但肯定有办法做到这一点吗?
答案 0 :(得分:2)
横行, 你想要的东西在非关系型数据库中无法轻易完成。 主要是因为他们没有集中思考并且与分布式计算有很强的联系。 例如,如果没有访问所有数据,就无法真正实现高效集,这几乎意味着任何基于集合的操作都必须需要访问所有这些。 由于NoSQL dbs通常用于分布式场景,因此它们无法真正支持它。 具体而言,RavenDB允许对指定集合进行某些操作,但它强烈建立在独立文档的假设之上,与其他文档没有很强的关系,或者需要以相同的方式一起操作的文档。 / p>
答案 1 :(得分:0)
从RDBMS到文档数据库的过渡并不完全顺利,为了使其最佳化,可能需要对模型进行一些重构。这是由于这些技术的不同性质。
重新。 RavenDB中基于集合的操作,请参阅:
http://ayende.com/blog/4535/set-based-operations-with-ravendb