这是关于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'。
在这种情况下哪种意见更好?如果你还有第三个解决方案,那就太棒了。谢谢。
答案 0 :(得分:1)
我认为保持会员详细信息是分开的,就像论坛签名一样。这样,当会员更新其详细信息时,所有帖子都会显示其当前信息,而您的应用程序不必更新每个帖子中的重复数据。
根据您的描述,您可能只会在用户创建的博文上显示此内容,而不是在页面上发表的每条评论中显示此内容。
如果您担心每个用户额外查询的性能成本,您可以始终缓存该用户数据(或生成的页面输出),而不是依赖于在单个数据库查询中获取所有博客信息。在尝试优化可能不是问题的用例之前,我会看到应用程序在实际使用中的执行情况。
另一种方法是仅将额外的用户详细信息显示为Ajax悬停(类似于SO显示established user的更多信息。