【问题标题】:Opinion on my case MongoDB schema design关于我的案例 MongoDB 模式设计的意见
【发布时间】:2012-08-02 03:48:17
【问题描述】:

这是 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 变量保持不变; “名称”和“网站”。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢!在您在第一段中解释之前,我认为还不够远。最后,就我而言,通过引用(成员详细信息)经常更新的数据的嵌入式文档也会给我带来性能成本,因此我将选择单独的文档。也感谢 Stennie 的缓存建议。
    猜你喜欢
    • 2013-06-12
    • 2015-07-17
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    相关资源
    最近更新 更多