MongoDB使用嵌套文档进行一对多设计挑战

时间:2017-06-24 01:59:45

标签: mongodb database-schema data-modeling

在mongodb之上为用户设置REST api设计架构的最佳方法是什么。

我来自关系背景。问题是将Relational数据模型转换为document或nosql数据模型。

我的api应该提供的用例如下:

  1. 为用户创建设置
  2. 更新用户的设置
  3. 阅读用户
  4. 的设置
  5. 删除用户的设置
  6. 用户可以与多个应用程序相关联。每个应用程序可以有多个设置。我从mongodb文档中读到了一对多关系,但没有感觉如何设计。

    我正在考虑的当前设计如下

    设计1:

    用户文档:

    {
      "userid":"r8142r",
      "usertype":"admin",
      "applications":[application1Reference,application2Reference....]
    }
    

    申请文件:

    {
      "applicationid":"application1Reference",
      "applicationSettings":[settings1Reference,settings2Reference...]
    }
    

    设置文档:

    {
      "settingid":"setting1Reference",
       "settingkey":"refreshTime",
       "settingValue":"20mins",
       "isActive":"yes",
       "updatedOn":"2017-06-22"
    }
    

    设计2:

    {
      "userid":"12345",
      "applicationID":[app1Ref,app2Ref],
      "settingKey":"refreshInterval",
      "settingValue":"20min",
      "groupName":"xgroup",
      "isActive":"yes",
      "uploadedOn":"2017-06-22"
    }
    

    设计1看起来更像是一种关系设计方式。第二种设计看起来像一个临时设计,因为它不适用于我的用例。是否有任何其他方式来设计文档。

    我想知道这是否是可扩展的设计。我的数据库设计可以满足所有用例。可能是什么问题。

1 个答案:

答案 0 :(得分:1)

当我第一次跳到 no-sql数据库时,我遇到了类似的问题。我总是试图设计更多的关系模式。但是如果你想充分利用no-sql数据库,你的设计应该更加面向文档,即文档需要分层保存,所有需要的数据需要存储在单个文档中,而不是多个文档或使用SQL中的引用约束将它们存储在不同的表中。这就是 MongoDB 不支持任何加入外键约束或交易的原因。此外,这使MongoDB更具可扩展性。

根据您的用例要求,由于每个用户可以拥有多个应用程序,并且每个应用程序可能有多个设置,并且User -> Application -> Settings具有one -> many关系,因此您可以将每个应用程序设置数据嵌入到用户文档中如下:

{
    //.. personal details
    "applications": [
        {
            "app_id":"12345",
            "name":"application_1",
            "settings": [
                {
                    "settingid":"1",
                    "settingkey":"refreshTime",
                    "settingValue":"20mins",
                    "isActive":"yes",
                    "updatedOn":"2017-06-22"
                },
                {
                    "settingid":"2",
                    "settingkey":"refreshTime",
                    "settingValue":"10mins",
                    "isActive":"no",
                    "updatedOn":"2017-06-22"
                }
            ]
        },
        {
            "app_id":"8999",
            "name":"application_12",
            "settings": [
                {
                    "settingid":"1",
                    "settingkey":"refreshTime",
                    "settingValue":"20mins",
                    "isActive":"yes",
                    "updatedOn":"2017-06-22"
                }
            ]
        }
    ]
}