2010-11-23 41 views
8

请原谅我的英语,我仍然试图掌握它。对象的MongoDB关系

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

以流行的博客文章/评论为例。发布没有或多个与它相关的评论。我创建Post对象,在Post中向IList添加一些Comment对象。没关系。

难道我补充一点,只是一个“帖子”收藏MonoDB或者我应该有两个集合 - 一个是blog.posts和blog.posts.comments?

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

[用户]有具有一个或多个[交易]其具有一个和仅一个[类型]一个或多个[帐户][Transactions]可以有一个或多个[Tag]分配给交易。 [网友]创建自己的[标签]特有的用户帐户,我们有时需要提供这些代码的报表(如五月,标签钻井费用为$ 123456.78)。

索引,我还以为他们分隔条件将是一件好事,但我很担心,这是不好的做法,从旧RBDMS天这一思想。

以某种方式,它就像博客的例子。我不知道我是否应该有1 [帐户]收集并坚持所有信息,或者有一个中间步骤将其分解为单独的收集。

其他相关查询是,当你持续来回时,你通常会回复与该记录相关的所有 - 即使不需要或者你是否限制?

+2

在我看来,你的数据模型是非常相关的。我不认为基于文档的数据存储是适合它的(请参阅@Hightechrider的回应)。 NoSQL意味着“非关系数据存储”,而不是“SQL备选”。这就是为什么NoSQL是这种系统的牛市销售术语。 – rubayeet 2010-11-23 07:18:51

回答

12

这取决于。

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

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

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

您可以在文档上索引INTO数组。不要以为索引只是一个文档简单字段上的索引(如SQL)。您可以使用文档上的标签集合,并将其索引到标签中。 (见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个博客帖子并不重要,因为他们点击不同步的副本副本,但对于财务报告,这种一致性确实很重要 - 您的报告可能不会加起来!