对象的MongoDB关系

时间:2010-11-23 06:55:51

标签: c# winforms model-view-controller database-design mongodb

请原谅我的英语,我仍然想要掌握它。

我已经开始学习MongoDB(来自C#背景),我喜欢MongoDB的想法。我在互联网上遇到了一些问题。

参加热门博客文章/评论示例。帖子没有或与之相关的许多评论。我创建Post对象,向Post中的IList添加一些Comment对象。太好了。

我是否只将其添加到MonoDB中的“帖子”集合中,还是应该有两个集合 - 一个是blog.posts和blog.posts.comments?

我有一个公平复杂的对象模型,最简单的方法是将其视为银行系统 - 我们的是挖掘。我试图用方括号突出显示表格。

[用户] 有一个或多个 [帐户] ,其中包含一个或多个 [Transactions] ,其中只有一个 > [类型] 即可。 [交易] 可以为交易分配一个或多个 [Tag] [用户] 为该用户帐户创建自己的 [Tags] ,我们有时需要按这些标记提供报告(例如,5月份,标记钻取费用为123456.78美元) )。

对于索引,我原本认为分离它们会很好,但是我担心从旧的RBDMS时代起这种想法是不好的。

在某种程度上,它就像博客示例。我不确定我是否应该拥有1个 [帐户] 集合并在那里保留所有信息,或者有一个中间步骤将其拆分为单独的集合。

另一个相关的问题是,当你来回持续时,你是否经常回复与该记录相关的所有 - 即使不是必需的,还是你有限制?

1 个答案:

答案 0 :(得分:11)

这取决于。

这取决于您希望拥有的每种类型对象中有多少。您可以将它们全部放入给定用户的单个MongoDB文档中吗?可能不是。

这取决于关系 - 用户帐户是一对多关系还是多对多关系?如果它是一对多且帐户数量很少,您可以选择将它们放在用户文档的IList中。

您仍然可以使用单独的集合在MongoDB中建模关系但是数据库中没有连接,因此您必须在代码中执行此操作。从性能角度来看,加载用户然后加载他们的帐户可能会很好。

您可以在文档上索引INTO数组。不要将Index视为文档上简单字段的索引(如SQL)。例如,您可以在文档上使用Tag集合并将索引编入索引。 (见http://www.mongodb.org/display/DOCS/Indexes#Indexes-Arrays

当您检索或写入数据时,您可以对任何文档进行部分读取和部分写入。 (见http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields

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

还有一个问题:你提到按标签计算总数。如果您想要会计质量的事务一致性,MongoDB可能不是您的正确选择。 “最终一致性”是NoSQL数据存储的游戏名称,它们通常不适合金融交易。例如,如果一个用户看到带有3个评论的博客帖子而另一个用户看到4个因为他们点击了不同步的不同副本副本并不重要,但对于财务报告,这种一致性确实很重要 - 您的报告可能不会加起来!