Рекомендации по схеме / запросу Mongoose (MongoDB, node.js) - PullRequest
5 голосов
/ 20 декабря 2011

Я пытаюсь сломать свой менталитет РСУБД с Mongoose в приложении node.js и могу использовать некоторые рекомендации относительно лучших практик.

Простой пример: скажем, есть две коллекции, организациии контакты.Это отношения один-ко-многим, и они оба должны быть одинокими.Однако в методе индекса я хочу вернуть массив организационных объектов, каждый из которых содержит массив контактных объектов-членов.(А позже я хочу вернуть массив контактов, каждый из которых имеет объект организации.)

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

  1. Встраивать контакты с их идентификаторами в документы организации.Тогда индексный запрос может быть Organization.find({}, function(err, orgs) { orgs[n].contacts[n]...}). Недостаток : требуется много дополнительного хранилища, и приходится обновлять вложенные контактные документы каждый раз, когда вы меняете «основной» контактный документ.

  2. Воспользуйтесь преимуществами Mongoose Заполните / DBRef структуру для хранения идентификаторов "внешнего ключа" в обеих таблицах.Запрос может быть: Organization.find({}}.populate('contacts').run(...). Недостаток : ключи должны храниться с обеих сторон.

  3. Перейти по более традиционному маршруту «внешний ключ», сохраняя только идентификатор организации в документе контакта.Запросите документы организации, а затем запросите все контакты в обратном вызове запроса организации, объединив данные в один объект для возврата. Недостаток : Несколько запросов и дополнительные накладные расходы на обработку (я считаю, что мы должны найти организации и контакты для этих организаций независимо, а затем выполнить итерацию по каждому из них, сопоставляя их вручную в общем поле _id, чтобы объединить их в новыйвыходной объект).

Я должен упустить лучший вариант.Что-то, что допускает схему # 3, но возвращает требуемый комбинированный объект с гораздо меньшими накладными расходами.

ПРИМЕЧАНИЕ : модуль async , кажется, может помочь с этим, но действительно ли это единственный / лучший способ?

1 Ответ

2 голосов
/ 20 декабря 2011

Это действительно зависит от запросов, которые вы собираетесь сделать.- Ваш сайт больше зависит от контактов или от организаций?- Вам часто нужно будет отображать все контакты из организации?- Какие данные о контактах необходимо отображать на странице организации?

И т. Д.

Так что это действительно зависит от потребностей вашего проекта.Страница вашей организации и контактов постоянно обновляется?Если нет, то дублирование данных не кажется такой плохой идеей, особенно если ваш сайт более читаемый.

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

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