繁体   English   中英

在 MongoDB 中设计多对多关系(而不是关系表)

[英]Designing Many-to-Many relationships in MongoDB (instead of relational tables)

使用一个经典的例子——假设我们有一个应用程序,它有一个 Courses 集合和一个 Students 集合,而每个学生可以参加很多课程,每个课程可以有很多参与者。 我们将需要查询一个学生有效参与的所有课程,但我们还需要查询正在参加单个课程的学生。

我知道使用关系数据库来处理这将是最佳解决方案,但现在我只想使用一种类型的数据库,即 MongoDB,现在我想问一下这种架构设计是否可以有效地工作? 使用它的优缺点是什么? 哪个设计会更好?

User: {
   _id,
   //...properties
}

Course: {
   _id,
   //...properties
}

CourseParticipate: {
   _id,
   userId,
   courseId,
   //...properties
}

CourseAdmin: {
   _id,
   userId,
   courseId,
   //...properties
}

现在我喜欢这个设计,因为将来如果我有能力使用多个数据库,很容易将这些 collections 转移到关系数据库(或不?),我也喜欢它,因为它写入数据很快并删除对象之间的关系,但正如我所见,它会使阅读查询慢一点(或很多?)。

因为我之前在网上没见过这个设计,所以我已经知道有更好的解决方案(我希望我没有听到发自内心的评论和回答,因为我是新人)。

我也想听听你说 Neo4j 能不能解决这个问题? 什么关系数据库在 MongoDB 旁边效果最好?

文档和文章的链接将非常有帮助! 谢谢!

这是具有多对多关系的数据的情况。 我认为您的数据库中有几千名学生和几百门课程。

首先,我可以使用以下设计,每个学生都嵌入课程详细信息,作为称为courses的子文档数组。

- students collection
id:
name:
courses: [ { id: 1, name: },  { id: 5, name: }, ... ]

- courses collection
id:
name:
description:

请注意,课程 ID 和名称都存储在 collections 中。 这是数据的重复。 这应该没问题,因为重复的细节不会经常更改(或可能根本不会更改)。

查询学生注册的所有课程,例如: db.students.find( { name: "John" } ) 这将返回一个具有匹配名称的学生文档和所有课程(数组字段)。 请参阅db.collection.find

查询所有注册特定课程的学生: db.students.find( { "courses.name": "Java Programming" } ) 这将返回课程名称与标准“java Programming”匹配的所有学生文档。 请参阅查询嵌入式文档数组

此外,您可以使用投影从结果中排除和包含字段。

笔记:

  • 您可以将学生信息嵌入课程集合中,而不是将课程嵌入学生中。 查询将与上述查询类似,但您将查询课程集合。 这取决于您的用例。
  • 您可以将课程 ID 字段存储在学生集合的课程数组中; 这是您经常更改课程名称字段的情况。 查询将使用 Aggregation $lookup (“加入”操作)来获取课程并从课程集合中获取。
  • 数据信息 Model 基于文档的 MongoDB 数据的设计

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM