在MongoDB中加入的最佳做法是什么?

时间:2013-07-07 20:50:30

标签: mongodb mongodb-java nosql

如您所见,我有两个名为SchoolStudent的课程。我想搜索“学校名称是bla bla bla的学生”和“学生的成绩高于90”的学校。我读了一些文件,但我有点困惑。

public class School extends BasicDBObject  {
  private int id;
  private String name;
  private String number;
  private List<Student> studentList = new ArrayList<Student>();,

  //getter and setters
}

public class Student extends BasicDBObject{
  private int id;
  private String name;
  private String grade;
  private School school;

  //getter and setters
}

1 个答案:

答案 0 :(得分:8)

MongoDB不是关系数据库。它不支持连接。要模拟连接,您必须查询第一个集合,获取结果,然后使用填充了第一个查询返回的文档的适用键值的大$in查询来查询第二个集合。这听起来既缓慢又丑陋,因此应该设计数据库模式以避免它。

对于您的示例,我会将学校名称添加到Student文档中。这样就可以通过单个查询来满足您的两种用例。

任何来自关系数据库背景的人现在会说“但这是一种冗余!你违反了第二种正常形式!”。这是事实,但规范化是特定于关系数据库的设计模式。它不一定适用于面向文档的数据库。那么哪些设计模式适用于面向文档的数据库?艰难的电话。这是一项新技术。我们仍然在想这个。