繁体   English   中英

如何处理mongodb中的多对多关系?

[英]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.

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