2

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

然而,就我而言,这似乎是一个两难的境地。我有一个文档,其中包含我可以嵌入它的参考,但它会花费我磁盘的大小。但是如果我做一个参考,它会给我带来相当大的性能成本。

这是一个例子,假设我有这个成员的“详细信息”作为我的问题:

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

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

首先,通过仅放置成员的 _id 来进行引用:

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

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

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

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

PS:在这个例子中可以看到,Member 和Blog 的关系是一对多的,所以一个member 可以有很多blog,但是member 的detail 变量保持不变;“名称”和“网站”。

在这种情况下有什么更好的意见吗?如果您也有第三种解决方案,那就太好了。之前谢谢。

4

1 回答 1

1

我认为将成员详细信息分开是可以的,例如论坛签名。这样,当会员更新他们的详细信息时,所有帖子都将显示他们当前的信息,而您的应用程序不必更新之前每个帖子中的重复数据。

从您的描述看来,您可能只在用户创建的博客帖子上显示此内容,而不是在他们在页面上发表的每条评论上。

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

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

于 2012-08-04T08:26:52.753 回答