在mongodb之上为用户设置REST api设计架构的最佳方法是什么。
我来自关系背景。问题是将Relational数据模型转换为document或nosql数据模型。
我的api应该提供的用例如下:
用户可以与多个应用程序相关联。每个应用程序可以有多个设置。我从mongodb文档中读到了一对多关系,但没有感觉如何设计。
我正在考虑的当前设计如下
用户文档:
{
"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看起来更像是一种关系设计方式。第二种设计看起来像一个临时设计,因为它不适用于我的用例。是否有任何其他方式来设计文档。
我想知道这是否是可扩展的设计。我的数据库设计可以满足所有用例。可能是什么问题。
答案 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"
}
]
}
]
}