Mongodb“手动参考”性能与传统DB的“表加入”相比

时间:2013-08-29 08:45:09

标签: mongodb

根据official document:“手动引用”操作通常是首选,experienced guy even suggest never use DBref,那么当我想查询具有关系的实体时,我认真考虑了两次查询的性能损失程度集合,特别是与传统的关系数据库相比 - 我们可以使用表连接在一个查询中检索预期结果。

非规范化示例

db.blogs.insert({
  _id: 1,
  title: "Investigation on MongoDB",
  content: "some investigation contents",
  post_date: Date.now(),
  permalink: "http://foo.bar/investigation_on_mongodb",
  comments: [
    { content: "Gorgeous post!!!", nickname: "Scott", email: "foo@bar.org", timestamp: "1377742184305" },
    { content: "Splendid article!!!", nickname: "Guthrie", email: "foo@bar.org", timestamp: "1377742184305" }
  ]}
               )

我们可以简单地使用:db.blogs.find()来获取我们想要的所有内容:包含评论的博客文章属于他们。

规范化示例

db.books.insert({ 
  _id: 1, 
  name: "MongoDB Applied Design Patterns", 
  price: 35, 
  rate: 5, 
  author: "Rick Copeland",
  ISBN: "1449340040",
  publisher_id: 1,
  reviews: [
    { isUseful: true, content: "Cool book!", reviewer: "Dick", timestamp: "1377742184305" },
    { isUseful: true, content: "Cool book!", reviewer: "Xiaoshen", timestamp: "1377742184305" }
  ]
  } 
); 
  
db.publishers.insert({ 
  _id: 1, 
  name: "Packtpub INC", 
  address: "2nd Floor, Livery Place 35 Livery Street Birmingham",
  telephone: "+44 0121 265 6484",
  } 
);

现在,如果我想获得有关单本书的完整信息,我必须手动查询两次,类似于以下内容:

> var book =  db.books.find({ "name": { $regex: 'mongo*', $options: 'i' } })
> db.publishers.find({ _id: book.publisher_id })

我知道的事情是:优先操作将由Mongo“ in memory ”处理,但我将在下面总结一下问题:

简单地说:面向文档的数据库主张“非规范化”数据以在一个查询中检索结果,但是,当我们必须存储关系数据时,它“建议”你使用“手动引用”,这意味着两次查询,而在关系数据库中,通过使用“表连接”将只有一次查询。

这对我来说没有意义:))

1 个答案:

答案 0 :(得分:1)

关系数据库还通过查询两个表来执行JOIN。但它的优势在于它可以在内部完成此操作,而无需与客户端通信来执行此操作。它可以立即查询第二个表。

MongoDB首先需要在应用程序可以制定第二个查询并将第二个查询发送回数据库之前,将第一个查询的结果发送到客户端。失去的时间是:

  1. 数据库服务器和应用程序服务器之间的网络延迟(几毫秒)
  2. 解释应用程序服务器上的响应,并从中生成$in - 查询(几μs)
  3. 应用程序服务器和数据库服务器之间的网络延迟(几毫秒)
  4. 根据应用程序服务器和数据库服务器的互连程度,我们在这里讨论几毫秒的罚款。