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

hel*_*one 0 mongodb nosql mongodb-java

我有两个类调用School,并Student为你看到的.我想搜索"学校名称是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
}
Run Code Online (Sandbox Code Playgroud)

Phi*_*ipp 9

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

对于您的示例,我会将学校名称添加到Student文档中.这将允许使用单个查询来满足您的两个用例.

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

  • @hellzone没有NoSQL这样的东西.当你真正意味着"MongoDB相对于关系数据库的要点是什么"时,其优点包括更好的聚类,更好的分片,对嵌套数据的支持以及它允许​​非同质数据(在同一集合中存储具有不同字段的文档).但只要您尝试将MongoDB减少到它与关系数据库共有的功能子集,您就不会对它感到满意. (2认同)