关于我的案例MongoDB架构设计的意见

时间:2012-08-04 07:41:09

标签: mongodb database-design database-schema schema-design database

这是关于MongoDB的一个非常常见的问题:何时嵌入以及何时引用。

然而在我的情况下,这似乎是某种两难的选择。我有一个文档,有一个参考,我可以嵌入它,但它将花费我的磁盘大小。但是如果我做一个参考,它将给我相当大的性能成本。

这是一个例子,说我有这个会员的'详细'作为我的问题:

Member: {
    _id: "abc",
    detail: {
        name: "Stack Overflow",
        website: "www.stackoverflow.com"
    }
}

我希望此会员的详细信息出现在每个博客中,此会员“asdf”因为显示的每个博客都会显示会员详细信息。因此,我可以为我的Blog文档做两个选项:

首先,仅通过放置成员的_id:

来进行引用
Blog: {
    _id: 123,
    memberId: "asdf"  ---> will be used as reference to query specific member
}

或者第二,将成员嵌入到Blog中:

Blog: {
    _id: 123,
    member: {
        _id: "asdf",
        detail: {
            name: "Stack Overflow",
            website: "www.stackoverflow.com"
        }
    }
}

因此第一个选项需要对成员进行另一个查询,这是性能问题。然而第二个选项更快,因为我只需要查询一次,但随着Blog数量的增加,我的磁盘会因嵌入文档“成员”的冗余数据而变大。

PS:正如您在本示例中所看到的,成员和博客关系是一对多的,因此成员可以拥有许多博客,但成员的详细信息变量保持不变; 'name'和'website'。

在这种情况下哪种意见更好?如果你还有第三个解决方案,那就太棒了。谢谢。

1 个答案:

答案 0 :(得分:1)

我认为保持会员详细信息是分开的,就像论坛签名一样。这样,当会员更新其详细信息时,所有帖子都会显示其当前信息,而您的应用程序不必更新每个帖子中的重复数据。

根据您的描述,您可能只会在用户创建的博文上显示此内容,而不是在页面上发表的每条评论中显示此内容。

如果您担心每个用户额外查询的性能成本,您可以始终缓存该用户数据(或生成的页面输出),而不是依赖于在单个数据库查询中获取所有博客信息。在尝试优化可能不是问题的用例之前,我会看到应用程序在实际使用中的执行情况。

另一种方法是仅将额外的用户详细信息显示为Ajax悬停(类似于SO显示established user的更多信息。