[英]how to deal with many-to-many relationship in mongodb?
在 MongoDB 中处理 1-1(通过 refs)或 1-N(通过填充虚拟)关系很容易
但是如何处理NM关系呢?
假设我有 2 个实体老师和教室
许多教师可以进入许多教室
许多教师可以进入许多教室
teacher.schema
{
name:String;
//classrooms:Array;
}
classrooms.schema
{
name:String;
//teachers:Array
}
有没有一种直接的方法(类似于填充虚拟)来保持这种 NM 关系,这样当一位老师被移除时,教室里的老师也可以自动改变?
我应该使用像TeacherToClassroom
这样的第三个“桥梁”模式来记录他们的关系吗?
我在想这样的事情,比如computed value
teacher.schema
{
name:String;
classrooms:(row)=>{
return db.classrooms.find({_id:{$elemMatch:row._id }})
}
}
classrooms.schema
{
name:String;
teachers:{Type:ObjectId[]}
}
这样我就可以管理教室中的教师 ID,然后教学模式中的教室属性将自动计算
文献描述了一些如何在 Mongodb 中实现 mn 关系的方法。
第一种方法是双向嵌入。 看一个使用书籍和电影导演的例子:
{
_id: 1,
name: "Peter Griffin",
books: [1, 2]
}
{
_id: 2,
name: "Luke Skywalker",
books: [2]
}
{
_id: 1,
title: "War of the oceans",
categories: ["drama"],
authors: [1, 2]
}
{
_id: 2,
title: "Into the loop",
categories: ["scifi"],
authors: [1]
}
第二种选择是使用单向嵌入。 这意味着您只能将其中一个文档嵌入到另一个中。 像这样(有类型的电影):
{
_id: 1,
name: "drama"
}
{
_id: 1,
title: "War of the oceans",
categories: [1],
authors: [1, 2]
}
当您嵌入的数据变大时,您可以使用类似分桶模式的东西将其拆分: https : //www.mongodb.com/blog/post/building-with-patterns-the-bucket-pattern
正如您在上面的示例中通过嵌入文档所看到的,您仍然只需要在一个位置修改数据。 您不需要任何中间表来执行此操作。
在某些情况下,您甚至可以省略作为独立对象没有意义的整个文档: 在 M:N 关系中吸收 N
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.