MongoDB: хранение и когда использовать отношения - PullRequest
8 голосов
/ 02 марта 2011

Я новичок в MongoDB, поэтому, пожалуйста, потерпите меня.

У меня есть 2 вопроса:

Сначала возьмите следующее:

// add a record
$obj = array( "title" => "Calvin and Hobbes", "author" => "Bill Watterson" );

Имеет ли MongoDBсохранить "заголовок" и "автор" как текст для каждой записи этого объекта в этой коллекции?Или он создает схему и преобразует их в номера полей (или вообще ничего, и хранит только данные)?

Мой второй вопрос: когда следует использовать «отношения»?Допустим, у меня есть 100 посредников, которые содержат (объектно) 1000 клиентов каждый, и у каждого клиента есть 10 проектов.Это позволяет манипулировать одним огромным общим объектом.

В мире SQL все это будет связано с "объектами".В мире документов мы пытаемся хранить полные объекты, внедряя подобъекты.

Однако это может быть громоздким.Какова лучшая практика для этого?Может кто-нибудь указать мне руководство, пожалуйста.

Спасибо.

Ответы [ 2 ]

13 голосов
/ 02 марта 2011

Есть ли имена полей MongoDB для каждой записи в этой коллекции?

Да, MongoDB сохраняет текст для каждой записи. На практике это обычно не слишком большая проблема, если дисковое пространство является ограничивающим фактором, вы можете рассмотреть что-то еще.

Когда следует использовать «отношения»?

Это больше искусство, чем наука. Документация Mongo по схемам является хорошим справочным материалом, но вот несколько моментов, на которые следует обратить внимание:

  • Положите как можно больше

    Радость базы данных документов заключается в том, что она исключает множество объединений. Ваш первый инстинкт должен состоять в том, чтобы разместить как можно больше в одном документе. Поскольку документы MongoDB имеют структуру и поскольку вы можете эффективно выполнять запросы внутри этой структуры, нет необходимости в немедленной нормализации данных, как в SQL. В частности, любые данные, которые бесполезны, кроме его родительского документа, должны быть частью того же документа.

  • Отдельные данные, которые можно ссылаться из нескольких мест в свою собственную коллекцию.

    Это не столько проблема «пространства хранения», сколько проблема «согласованности данных». Если многие записи ссылаются на одни и те же данные, это более эффективно и менее подвержено ошибкам для обновления одной записи и сохранения ссылок на нее в других местах.

  • Размер документа

    MongoDB накладывает ограничение на размер в 4 МБ для одного документа. В мире ГБ данных это звучит мало, но это также 30 миллионов твитов или 250 тысяч типичных ответов переполнения стека или 20 мерцающих фотографий. С другой стороны, это гораздо больше информации, чем можно было бы представить за один раз на типичной веб-странице. Сначала подумайте, что облегчит ваши запросы. Во многих случаях беспокойство о размерах документов будет преждевременной оптимизацией.

    В приведенном вами примере я бы сделал 3 отдельные коллекции, потому что мне не нужно знать о 9 других проектах, чтобы создать листинг для проекта. Я буду держать запросы простыми. (Но см. Protip внизу)

  • Сложные структуры данных:

    MongoDB может хранить произвольные глубоко вложенные структуры данных, но не может эффективно их искать. Если ваши данные образуют дерево, лес или график, вам необходимо хранить каждый узел и его ребра в отдельном документе. (Обратите внимание, что есть хранилище данных, специально разработанное для данных этого типа, которое также следует учитывать)

  • Согласованность данных

    MongoDB делает компромисс между эффективностью и согласованностью. Правило состоит в том, что изменения в одном документе всегда атомарные, в то время как обновления нескольких документов никогда не следует считать атомарными. Также нет способа «заблокировать» запись на сервере (вы можете встроить это в логику клиента, используя, например, поле «блокировка»). Когда вы разрабатываете свою схему, подумайте, как вы будете поддерживать согласованность своих данных. Как правило, чем больше вы храните в документе, тем лучше.

Pro Tip

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

В вашем примере это будет означать сохранение имен клиентов вместе с ObjectID в документе посредника, чтобы я мог создать ссылку на каждого клиента по имени без отдельного запроса. Если для создания URL-адреса для клиента требуется что-то помимо идентификатора документа, я бы также сохранил это.

Подобные трюки могут сократить ситуации с запросами 1 + n.

1 голос
/ 02 марта 2011

Сохраняет ли MongoDB «заголовок» и «автор» в качестве текста для каждой отдельной записи этого объекта в этой коллекции?

MongoDB не имеет схемы - поэтому ответ очевиден: да, посколькунет такой вещи как схема

Мой второй вопрос: когда следует использовать «отношения»?Допустим, у меня есть 100 посредников, которые содержат (объектно) 1000 клиентов каждый, и у каждого клиента есть 10 проектов.Это позволяет манипулировать одним огромным общим объектом.

Пожалуйста, отметьте

http://www.mongodb.org/display/DOCS/Schema+Design

Ваши варианты - встроенные документы, ссылки на базу данных или несколько запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...