Mongoose: populate () / DBref или дублирование данных? - PullRequest
13 голосов
/ 01 ноября 2011

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

  1. Пользователи
  2. Загрузка


С каждой загрузкой связан 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()? Какова лучшая практика в этом распространенном сценарии?

Ответы [ 2 ]

16 голосов
/ 06 ноября 2011

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

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

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

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


Просто ссылка на мой предыдущий ответ на похожий вопрос: Монго БД отношений между объектами

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

Варианты использования

Клиент / Заказ / Элемент заказа

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

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

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

Основы проектирования схемы

Kyle Banker, 10gen

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

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

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

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

3 голосов
/ 04 ноября 2011

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

«Связывание» - это просто помещение ObjectId в поле другой модели.1004 * Вот лучшие практики Монго http://www.mongodb.org/display/DOCS/Schema+Design#SchemaDesign-SummaryofBestPractices

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

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