如何在不使用中间表的情况下模拟MongoDB中的多对多关系?

时间:2014-04-21 15:19:10

标签: mongodb many-to-many nosql

我正在尝试在MongoDB中建立多对多关系模型,并要求我跟踪关系中的“元数据”。

这些模型本身看起来很简单:

Student model
{ 
  _id: <ObjectID1>,
  name: "Foo Bar"
}

School model
{ _id: <ObjectID123>,
  name: "Cityville Highschool",
  location: "Cityville, Stateville"
}

现在,我希望将这些链接以多对多的关系联系起来,这样学生就可以成为多个学校的一部分,学校可以有很多学生。通常在MongoDB中,您可以在每个模型中保留另一个模型的数组。例如:

Student model
{ 
  _id: <ObjectID1>,
  name: "Foo Bar",
  schools: [<SchoolID1>, <SchoolID2>, ...]
}

School model
{ _id: <ObjectID123>,
  name: "Cityville Highschool",
  location: "Cityville, Stateville",
  students: [<StudentID1>, <StudentID2>, ...]
}

但是,如果我现在想要获得关于该关系的数据呢?例如,学生进入和退出学校的日期:“enter_date”和“exit_date”。通常,在sql中,你会有一个StudentSchool的JOIN表,如下所示:

StudentSchool:
{ studentId: 123,
  schoolId:  456,
  enter_date: 12-12-2014,
  exit_date:  12-12-2015
}

你会如何在MongoDB中做到这一点?我已经排除了一些选项:

  1. 创建一个基本上模仿sql JOIN表的新Collection(即StudentSchool集合)。排除因为似乎不是使用Mongo的正确方法,也可能难以管理更新/删除。

1 个答案:

答案 0 :(得分:0)

在Student模型中,你不只是将SchoolIds放入数组,而是提供元数据的整个文档?例如。 enter_date,exit_date?在两个地方(即学生学校)都可能有太多的注释,但即使这样也可能是可行的,具体取决于预期用途。

Student model
{ 
  _id: <ObjectID1>,
  name: "Foo Bar",
  schools: [
    { _id: <SchoolID1>,
      enter_date: ...,
      exit_date: ...
    },
    { _id: <SchoolID2>,
      enter_date: ...,
      exit_date: ...
    },
    ...
  ]
}