2011-01-05 66 views
5

我对MongoDB和NoSQL相当陌生。我有一个收集主题,每个主题可以有很多评论。每个评论都会有元数据,而不会使评论集合有用。MongoDB:你还应该提供链接到其他集合的ID还是只包含集合?

在MySQL中我会使用外键链接到的意见表,但在NoSQL的我应该只是包括主题集合中的一个集合的评论或有它是在一个单独的收集和链接通过IDS?

谢谢! 马特

+0

的可能重复的[对对象的MongoDB关系](http://stackoverflow.com/questions/4253496/mongodb-relationships-for-objects) – 2011-01-05 05:12:13

回答

8

这取决于。

这取决于您期望拥有的每种类型的对象的数量。您是否可以将它们全部整合到一个给定主题的单个MongoDB文档中?可能不会。

这取决于关系 - 你有一对多或多对多的关系吗?如果它是一对多的,并且相关实体的数量很少,则可以选择将它们嵌入文档中的IList中。如果它是多对多的,你可能会选择使用更传统的关系,或者你可能选择将双方嵌入为IList。

你可以在MongoDB中仍然模型的关系有独立的集合但在数据库中没有连接,所以你需要做的是,在代码。从性能的角度来看,加载主题然后加载评论可能会很好。

其他提示:

用MongoDB的,你都可以索引上的文档数组。因此,不要将索引视为仅仅是文档简单字段上的索引(如SQL)。您可以在主题上使用标签集合,并将其索引到标签中。 (见http://www.mongodb.org/display/DOCS/Indexes#Indexes-Arrays

当您检索或写入数据,你可以做一个部分读取和任何文件的部分写。 (请参阅http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields

最后,当您无法看到如何使用集合和索引获取所需内容时,可以使用map reduce实现它。例如,要查找当前正在使用的所有标签,并按照其使用频率排序,可以将每个Topic映射为发布其中使用的标签,然后减少该标签以获得您想要的结果。然后,您可能会永久存储该地图缩放的结果,并且只在需要时才更新它。

这是从关系的思维相当显著的思维转变但它是值得的,如果你需要一个NOSQL方法带来的可扩展性和灵活性。

相关问题