Есть ли имена полей MongoDB для каждой записи в этой коллекции?
Да, MongoDB сохраняет текст для каждой записи. На практике это обычно не слишком большая проблема, если дисковое пространство является ограничивающим фактором, вы можете рассмотреть что-то еще.
Когда следует использовать «отношения»?
Это больше искусство, чем наука. Документация Mongo по схемам является хорошим справочным материалом, но вот несколько моментов, на которые следует обратить внимание:
Положите как можно больше
Радость базы данных документов заключается в том, что она исключает множество объединений. Ваш первый инстинкт должен состоять в том, чтобы разместить как можно больше в одном документе. Поскольку документы MongoDB имеют структуру и поскольку вы можете эффективно выполнять запросы внутри этой структуры, нет необходимости в немедленной нормализации данных, как в SQL. В частности, любые данные, которые бесполезны, кроме его родительского документа, должны быть частью того же документа.
Отдельные данные, которые можно ссылаться из нескольких мест в свою собственную коллекцию.
Это не столько проблема «пространства хранения», сколько проблема «согласованности данных». Если многие записи ссылаются на одни и те же данные, это более эффективно и менее подвержено ошибкам для обновления одной записи и сохранения ссылок на нее в других местах.
Размер документа
MongoDB накладывает ограничение на размер в 4 МБ для одного документа. В мире ГБ данных это звучит мало, но это также 30 миллионов твитов или 250 тысяч типичных ответов переполнения стека или 20 мерцающих фотографий. С другой стороны, это гораздо больше информации, чем можно было бы представить за один раз на типичной веб-странице. Сначала подумайте, что облегчит ваши запросы. Во многих случаях беспокойство о размерах документов будет преждевременной оптимизацией.
В приведенном вами примере я бы сделал 3 отдельные коллекции, потому что мне не нужно знать о 9 других проектах, чтобы создать листинг для проекта. Я буду держать запросы простыми. (Но см. Protip внизу)
Сложные структуры данных:
MongoDB может хранить произвольные глубоко вложенные структуры данных, но не может эффективно их искать. Если ваши данные образуют дерево, лес или график, вам необходимо хранить каждый узел и его ребра в отдельном документе. (Обратите внимание, что есть хранилище данных, специально разработанное для данных этого типа, которое также следует учитывать)
Согласованность данных
MongoDB делает компромисс между эффективностью и согласованностью. Правило состоит в том, что изменения в одном документе всегда атомарные, в то время как обновления нескольких документов никогда не следует считать атомарными. Также нет способа «заблокировать» запись на сервере (вы можете встроить это в логику клиента, используя, например, поле «блокировка»). Когда вы разрабатываете свою схему, подумайте, как вы будете поддерживать согласованность своих данных. Как правило, чем больше вы храните в документе, тем лучше.
Pro Tip
Даже когда вы используете ссылки, часто бывает полезно сохранить немного данных из ссылки в родительском документе. Как правило, я храню достаточно информации, чтобы построить значимую ссылку на потомка в родительском.
В вашем примере это будет означать сохранение имен клиентов вместе с ObjectID в документе посредника, чтобы я мог создать ссылку на каждого клиента по имени без отдельного запроса. Если для создания URL-адреса для клиента требуется что-то помимо идентификатора документа, я бы также сохранил это.
Подобные трюки могут сократить ситуации с запросами 1 + n.