mongodb - 对我的案例MongoDB模式设计的看法

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

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

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

最佳答案

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

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

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

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

关于mongodb - 对我的案例MongoDB模式设计的看法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11806841/

相关文章:

java - "main"org.apache.spark.SparkException : Task not serializable

sql - 食谱数据库设计建议

mysql - 表之间具有一对一关系的理由

MySQL : Slow show databases;

node.js - 如果特定公会不存在,则会出现数据库错误

java - Spring 数据休息: Nested objects not being stored in separate Mongo Repository

php - 如何以原子方式重新排序 MongoDB 中的数组项?

python - 将信息添加到 Django 中 ManyToMany 引用的模型实例中

php - 按时区从sql表中排序和选择

mysql - 我不断收到“外键引用无效列?