【问题标题】:How store data (documents) in MongoDB如何在 MongoDB 中存储数据(文档)
【发布时间】:2017-12-28 07:10:39
【问题描述】:

我正在学习 mongodb,想为网络博客页面构建一个小数据库。 众所周知,在 mongo 中,我们使用集合和文档,而不是表和记录。

我有 2 个文档(实体):用户(id,nikname)和出版物(id,title ...) 在关系数据库中,我们将 user_id 作为“出版物”内的列,这意味着用户可以拥有很多出版物。

示例 1

User 
{
  id: "123456",
  nikname: "cool guy",
  publications: [   
        {
            id: "some id1",
            title: "some title111",
            text: "bla bla bla",
            // any fields
        },
        {
            id: "some id2",
            title: "some title222",
            text: "bla bla bla",
            // any fields
        },
        ....
    ]
}

Publication 
{
    id: "some id",
    title: "some title",
    text: "bla bla bla",
    // any fields       
} 

在上面的示例中,每个用户都有自己的出版物数组。

我的问题是:这是一个很好的方法吗?如果一个用户有 1000 个出版物怎么办?

此外,如果每个用户都有自己的出版物,那么为什么我们需要存储出版物表(在 MONGO 中称为 COLLECTION) 在用户之外作为单独的实体。

我还在考虑在用户内部存储出版物 ID。

示例2

User 
{
  id: "123456",
  nikname: "cool guy"
}

Publication 1
{
    id: "some id",
    title: "some title",
    text: "bla bla bla",
    // any fields   

    USER_ID: 123456 
} 

Publication 2
{
    id: "some id",
    title: "some title",
    text: "bla bla bla",
    // any fields

    USER_ID: 123456     
} 

Example2 与关系方法没有区别...

那么什么方法会更好呢?

简而言之,想知道与 mongo 合作过的人的意见。

【问题讨论】:

  • 第一种方法是要走的路。正如您所说,第二个示例是关系方法;不过,它在某些用例中可能很有用。但是,就您而言,当您获取用户时,通常也需要她的帖子。因此,将出版物嵌入到用户本身中绝对没问题(而且速度更快)。
  • 如果使用第一种方法,您不会为 2 个不同的用户两次存储相同的数据,那么第一种方法就是要走的路。我的意思是,如果许多用户的出版物不同,那么方法 1 是可以的,但如果不是这样,那么分离数据总是更好,因为它可以帮助您不存储相同的信息两次、三次或“ n' 次。

标签: mongodb


【解决方案1】:

在 Mongo 中,您可以通过 3 种方式来设计模型关系。

  • 一对一
  • 一对多(嵌入式文档):您的示例 1
  • 一对多(文档参考):您的示例 2

经验法则是您需要考虑您的数据检索模式 您的应用程序。

例如,如果您的应用程序需要大量获取与特定用户相关的发布,您可以使用示例 1,并且您不需要在单独的集合中维护发布(除非应用程序需要它)。只要单个文档不超过硬性限制,拥有大量子文档不是问题。

如果您的应用程序需要按出版物和用户查询(类似于关系模型),您的一个很好的示例 2。但是我认为这不是一个优化的解决方案。

一些资源: https://docs.mongodb.com/manual/applications/data-models-relationships/

【讨论】:

  • 感谢您的回复。我需要考虑一下你的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多