前言
MongoDB不同于我们常用的mysql,作为一款非关系型数据库,数据存储已类似于json格式存储在文档里,不存在外建,无法实现mysql的表格之间关联。那么,对于一对一,一对多,多对一,多对多关系如何实现呢?
一对多
对于一条班级数据
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"name": "软件181班",
"number": "36"
}
与多条学生数据
{
"_id":ObjectId("52ffc33cd85242f436000002"),
"name": "张三",
"num": "185762",
"address": "河北省XX市"
}
{
"_id":ObjectId("52ffc33cd85242f436000003"),
"name": "李四",
"num": "185763",
"address": "河北省XX市"
}
有嵌入和引用两种方法
嵌入
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"name": "软件181班",
"number": "36",
"student": [
{
"name": "张三",
"num": "185762",
"address": "河北省XX市"
},
{
"name": "李四",
"num": "185763",
"address": "河北省XX市"
}]
}
优点是一次查询便可找到关联数据。
缺点是随着关联数据量的增加,会增加读写时间。
引用
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"name": "软件181班",
"number": "36",
"student_ids": [
ObjectId("52ffc4a5d85242602e000001"),
ObjectId("52ffc4a5d85242602e000002")
]
}
引用方式,对于学生基础数据存储在学生表,一条班级数据只存储所有相关学生id。
关联查询时,需要两次查询,第一次查询班级信息,第二次使用班级关联学生id查询学生信息。
优点是当大量关联数据时减少一次读写时间。
缺点是造成多次查询,增加查询时间。
多对多
对于多对多关系我们需要具体问题具体分析。
比如图书和标签多对多。只需要查找图书对应标签,而没有通过标签查找图书功能(假如没有)。那么只需要在一张表去记录图书和标签数据即可。
{
"_id":ObjectId("00000111111"),
"name": "计算机组成原理",
"tag": [
{
"name": "计算机",
},
{
"name": "考研",
}]
}
{
"_id":ObjectId("00000111111"),
"name": "汤家凤高等数学18讲",
"tag": [
{
"name": "数学",
},
{
"name": "考研",
}]
}
但是对于课程和班级多对多来讲,我们有时需要查询班级上哪几门课程,有时需要查询这门课程都哪几个班级上,但是大多情况下都是查询班级上哪几门课程。我们就可以设置一个班级表,一个课程表,在班级表下关联相关课程。
班级表
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"name": "软件181班",
"number": "36",
"klass_ids": [
ObjectId("52ffc4a0001"),
ObjectId("52ffc4a0002")
]
}
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"name": "软件182班",
"number": "35",
"klass_ids": [
ObjectId("52ffc4a0001"),
ObjectId("52ffc4a0003")
]
}
课程表
{
"_id":ObjectId("52ffc4a0001"),
"name": "数据结构",
}
{
"_id":ObjectId("52ffc4a0002"),
"name": "计算机网络",
}
{
"_id":ObjectId("52ffc4a0003"),
"name": "软件工程",
}
对于大多数情景,我们可以通过班级查询有哪些课程。对于课程查询有哪些班级,我们也可以通过语句反查。
总结
对比Mysql来说,NoSql相对于更加灵活,我们应抛弃mysql的思想,服务于我们的场景去设计数据库。