[英]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”匹配的所有学生文档。 请参阅查询嵌入式文档数组。
此外,您可以使用投影从结果中排除和包含字段。
笔记:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.