乐趣区

关于mongodb:MongoDB-关系实现

前言

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 的思维,服务于咱们的场景去设计数据库。

退出移动版