2013-08-29 3 views
2

В соответствии с 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: "[email protected]", timestamp: "1377742184305" }, 
    { content: "Splendid article!!!", nickname: "Guthrie", email: "[email protected]", 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 «в памяти», но у меня будет сводный вопрос ниже:

Простыми словами: Документированная база данных защищает данные «denormalize» для получения результата в рамках одного запроса, однако, когда мы должны хранить реляционные данные, это «предлагает» вам использовать «ручную ссылку», что означает дважды запрос , тогда как в реляционной БД будет только один запрос времени, используя «соединение таблицы».

Это не имеет никакого смысла для меня :)

ответ

1

реляционная база данных также выполняет соединение с помощью запросов обеих таблиц. Но у него есть то преимущество, что он может сделать это внутренне и не должен общаться с клиентом для этого. Он может запросить вторую таблицу сразу.

MongoDB сначала должен отправить результаты первого запроса клиенту, прежде чем приложение сможет сформулировать и отправить второй запрос обратно в базу данных. Время, потерянное на это:

  1. Задержка в сети между сервером базы данных и сервера приложений (пара мс)
  2. Interprete ответ на сервере приложений и генерировать $in-запросов от него (пару микросекунд)
  3. задержка в сети между сервером приложений и сервером баз данных (пара мс)

в зависимости от того, насколько хорошо сервер приложений и сервер базы данных взаимосвязаны, мы говорим о казни нескольких мс здесь.

Смежные вопросы