我正在为芒果数据库设计一些数据模型,我有一些类似于下面的json的要求。
Single_Collection。
{
"collegeid": 1234,
"Name": "aaaa",
"otherinfo": 1,
"studnet":[
{
"stdid": 1,
"name": "n1"
},
{
"stdid": 2,
"name": "n2"
}
]
}
两个收藏集。
大学信息
{
"collegeid": 1234,
"Name": "aaaa",
"otherinfo": 1
}
学生信息收集
{
"collegeid": 1234,
"stdid": 1,
"name": "n1"
}
{
"collegeid": 1234,
"stdid": 2,
"name": "n2"
}
这是阅读表现的最佳方式(可以单独收集或分开阅读),我可以阅读更多的书,例如给定的学生证可以找到大学证。 学生证列表会很大。
我还要执行更多的学生插入操作
答案 0 :(得分:1)
IMO,每种模型设计都有其优点和缺点,我们所说的“更好的方式”取决于您的用例(如何查询数据?您是否需要所有数据?开始吗?是否需要分页?等...)
让我们从您的要求开始。
显然,大学与学生是 1:m 映射,因为在一所大学中有很多学生,但每个学生只能留在一所大学。
我将向您展示一些不同的模型设计,并提供每种模型的优缺点。
这是您提到的单个收藏集的设计。
{
"collegeid":1234,
"Name":"aaaa",
"otherinfo":1,
"studnet":[
{
"stdid":1,
"name":"n1"
},
{
"stdid":2,
"name":"n2"
}
]
}
优点:
缺点:
这是您提到的两个集合的设计。它类似于RDBMS表,学生模型拥有其大学的参考关键点。
{
"collegeid":1234,
"Name":"aaaa",
"otherinfo":1
}
{
"collegeid":1234,
"stdid":1,
"name":"n1"
}
{
"collegeid":1234,
"stdid":2,
"name":"n2"
}
优点:
"collegeid"
和"stdid"
字段上添加索引。缺点:
这种方法看起来像是将方法1和方法2混合在一起。我们有两个馆藏:大学将把学生嵌入其中,还有一个单独的学生馆藏。因此,两个集合中的学生数据都是重复的。
{
"collegeid":1234,
"Name":"aaaa",
"otherinfo":1,
"studnet":[ // duplicated here!
{
"stdid":1,
"name":"n1"
},
{
"stdid":2,
"name":"n2"
}
]
}
{
"collegeid":1234,
"stdid":1,
"name":"n1"
}
{
"collegeid":1234,
"stdid":2,
"name":"n2"
}
优点:
缺点:
这是方法3的变体。 我们假设您的用例是:
简而言之,用户一开始并不需要所有学生的全部数据,他只需要学生的基本信息(例如学生ID)。如果用户接受这种情况,则可以使用以下模型:
{
"collegeid":1234,
"Name":"aaaa",
"otherinfo":1,
"studnetIds":[1, 2] // only student IDs are duplicated
}
{
"collegeid":1234,
"stdid":1,
"name":"n1"
}
{
"collegeid":1234,
"stdid":2,
"name":"n2"
}
学院中只有学生ID。与方法3相比,这是不同的。
优点:
缺点: