对象的MongoDB关系

Ali*_*ows 8 c# model-view-controller database-design mongodb winforms

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

我已经开始学习MongoDB(来自C#背景),我喜欢MongoDB的想法.我在互联网上有一些例子.

以流行的博客文章/评论为例.帖子没有或与之相关的许多评论.我创建Post对象,向Post中的IList添加一些Comment对象.没关系.

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

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

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

对于索引,我会认为分离它们会很好,但是我担心从旧的RBDMS时代这个想法是不好的做法.

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

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

Ian*_*cer 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实现它.例如,要查找当前正在使用的所有标签按其使用频率排序,您将映射发出其中使用的标签的每个文档,然后您将减少该集合以获得所需的结果.然后,您可以永久存储该地图的结果,并在需要时仅将其更新.

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