2014-01-23 3 views
3

Предположим, я создаю дискуссионный форум, используя Node.js и mongoose. Пользователь может иметь несколько форумов, а форум может иметь несколько комментариев. Пользователь также может приглашать других пользователей на форум. Таким образом, мой вопрос касается дизайна модели с использованием справочного или встроенного документа!Встраиваемый документ с ссылкой на модель дизайна мангуста?

Если я иду с вложенным документом, он будет выглядеть так:

var Comment = new Schema({ ... }); 

var Forum = new Schema({ 
    title: {type: String}, 
    content: {type: String}, 
    comments: [Comment], 
    attendees: [User] 
}); 

var User = new Schema({ 
    name: {type: String}, 
    email: {type: String}, 
    forums: [Forum] 
}); 

var Account = mongoose.model('Account', User); 

Используя вышеуказанную конструкцию, я боролся с: когда пользователь добавляет комментарий на форум, а форум в моих форумах, Я не думаю, что мне удастся обновить новый комментарий в моем списке. Я? Вы знаете, как заставить встроенный документ работать в этом случае?

Таким образом, я думал об использовании ссылка in mongoose. В этом случае у меня будет две коллекции: Счет и Форум. Добавление нового комментария на форум не является проблемой в этом случае. Я прав?

Будет ссылка будет лучше, чем встроенный документ для этого приложения?

Спасибо заранее,

+0

Помог ли вам один из ответов ниже? – Chev

+0

Это сообщение было полезно для меня, чтобы понять внедрение. – DataEngineer

ответ

26

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

Embedding:

  • Малые поддокументами
  • Данные, которые не меняются регулярно
  • Eventual консистенции является приемлемым
  • документов, которые растут на небольшой amout
  • Данные, которые вам часто понадобятся для выполнения второго запроса для извлечения
  • Fas т читает

Referencing:

  • Большие вложенные документы
  • Летучие данные
  • Немедленное консистенция необходимо
  • документов, которые растут большое количество
  • Данные, которые вы часто будете исключать из результатов
  • Быстрые записи

Это exctract из книги о манго, которую я читал. Это только общие правила, но из моего опыта, использование их делает его очень ясным, чтобы ссылаться или вставлять большую часть времени.

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

Надеюсь, это поможет!

+0

Я думаю, что это должно быть отмечено как ответ. – Chev

+0

@AlexFord хмм Я бы не стал спорить об этом: один: что книга MongoDB читала именно с момента «немедленной согласованности»? Я не уверен, что он имеет в виду, но ручная ссылка в MongoDB не обеспечивает целостности – Sammaye

+2

@Sammaye «Немедленная согласованность» - один объект, на который ссылаются многие другие. Если вы его обновите, вы получите обновленные данные от любого объекта, который ссылается на это. «Возможная консистенция» - один объект вложен во многие другие объекты, поэтому, если вы его измените, вы должны изменить его повсюду, так что вы можете столкнуться с ситуацией, когда некоторые из них обновлены, а некоторые нет. Конечно, это не имеет ничего общего с последовательностью транзакций, когда вам нужно обновить объект буксировки или нет, например. –

3

Лично мне нравится делать ссылки в таких ситуациях, как ваша. Таким образом, я могу получить комментарий от пользователя, пользователя с форума, форума из комментария, форума от пользователя и т. Д., Не беспокоясь о сложных запросах встроенных документов. Я даже не хочу хранить встроенные справочные документы. Если между форумом и комментариями существует одно-много отношений, я бы сохранил ссылку на форум в комментарии и ссылку на комментарий на форуме, потому что, когда вы добавляете/удаляете комментарии из коллекции комментариев, вам также необходимо удалить встроенную справочный документ из сборника комментариев на форуме.

Я могу запросить форум из комментария, используя ссылку на форум, и я могу получить все комментарии для форума, запросив коллекцию комментариев для этой ссылки на форуме (это всего лишь идентификационный номер, пока мангуста не заселяет его за кулисами для вы).

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