Подтвердить что ты не робот

Mongoose: populate()/DBref или дублирование данных?

У меня есть две коллекции:

  • Пользователи
  • Загрузки


Каждая загрузка имеет связанный с ней User, и мне нужно знать их данные, когда просматривается Upload. Лучше всего дублировать эти данные внутри записи Uploads или использовать populate(), чтобы извлечь эти данные из коллекции Users, на которую ссылается _id?


ВАРИАНТ 1

var UploadSchema = new Schema({
    _id: { type: Schema.ObjectId },
    _user: { type: Schema.ObjectId, ref: 'users'},
    title: { type: String },
});


ВАРИАНТ 2

var UploadSchema = new Schema({
    _id: { type: Schema.ObjectId },
    user: { 
           name: { type: String },
           email: { type: String },
           avatar: { type: String },
           //...etc
          },
    title: { type: String },
});


При использовании "Варианта 2", если какая-либо из данных в изменениях коллекции Users мне придется обновить ее во всех связанных записях Upload. С "Вариантом 1", с другой стороны, я могу просто охладиться и populate() обеспечить, чтобы последние данные пользователя всегда показывались.

Являются ли накладные расходы использованием populate() значительным? Какова наилучшая практика в этом распространенном сценарии?

4b9b3361

Ответ 1

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

Еще один вопрос, который вы должны задать себе: каждый раз, когда мне нужны эти данные, нужны ли встроенные объекты (и наоборот)? Сколько раз эти данные будут обновлены? Сколько раз эти данные будут прочитаны?

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

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


Просто ссылка на мой предыдущий ответ по аналогичному вопросу: Отношения между Mongo DB между объектами

Я думаю, что этот пост будет для вас правильным http://www.mongodb.org/display/DOCS/Schema+Design

Использовать случаи

Заказ/Заказ/Заказная позиция

Заказы должны быть коллекцией. клиентов коллекции. Позиции должны быть массивом позиций, встроенных в объект заказа.

Система ведения блога.

Сообщения должны быть коллекцией. автор сообщения может быть отдельной коллекцией или просто полем в сообщениях, если только адрес электронной почты. комментарии должны быть встроенными объектами в столбце для производительности.

Основы дизайна схемы

Кайл Банкир, 10gen

http://www.10gen.com/presentation/mongosf2011/schemabasics

Индексирование и оптимизация запросов Элвин Ричардс, старший директор по корпоративной инженерии

http://www.10gen.com/presentation/mongosf-2011/mongodb-indexing-query-optimization

** Эти 2 видеоролика являются лучшими на mongoddb когда-либо видели imho *

Ответ 2

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

"Связывание" просто помещает ObjectId в поле из другой модели.

Вот лучшие рекомендации Монго http://www.mongodb.org/display/DOCS/Schema+Design#SchemaDesign-SummaryofBestPractices

Связывание/DBRefs http://www.mongodb.org/display/DOCS/Database+References#DatabaseReferences-SimpleDirect%2FManualLinking