Какой принцип использовать для хранения данных в MongoDB?

Пишется веб-сервис (скажем, для каталога книг). Используются node.js + MongoDB. Возник вопрос по хранению данных в базе. Какой подход лучше использовать? Есть два основных типов данных - пользователь, книга. Присутствие дополнительных типов зависит от варианта.

Есть 2 варианта:
1) Не использовать дополнительные типы данных, то есть все данные о произведении хранить в отдельном документе коллекции "Произведения" (то есть отзывы о нём, имя автора, категория и т.д.)
2) Использовать дополнительные типа данных, то есть создавать связанные коллекции с "Произведениями" - "Отзывы", "Категории произведений", "Авторы".

В будущем потребуется хранить и редактировать огромные объёмы информации, и поэтому интересно, что же будет лучше в плане масштабирования системы?

Возможны вы посоветуете избрать какой-то другой подход? Допустим, отказаться от использования schemaless БД? Все данные должны быть чётко структурированы.
  • Вопрос задан
  • 3353 просмотра
Пригласить эксперта
Ответы на вопрос 5
Рекомендую почитать "50 Tips and Tricks for MongoDB". Текста не много, а информации полно. Здесь в ответах немного напутали - то, что у вас под 1ым пунктом - это денормализованная коллекция. Плюсы в том, что за один запрос имеете всю информацию по обьекту, ну а минусы соответственно, что сложно применять правки. А 2ой пункт, это уже нормализованная - и тут всё наоборот. Но главное, это грамотно балансировать между ними, а не выбирать одну из сторон. Структура очень зависит не только от структуры данных, но и того - как мы используем эти данные (какие выборки делать будем) и на сколько важна их актуальность. Пару советов из разных сторон:
- если идете по первому пути - то можете хранить также все подсущности в отдельных коллекциях. Изменяя подсущность, изменяете её в своей коллекции, и не бойтесь писать скрипты для нормализации, которые по крону будут актуализировать основную коллекцию.
- а если по второму, то храните не только `_id` подсущностей, но также часть обьекта, которая всегда будет нужна, что бы минимизировать запросы.
Ответ написан
Комментировать
@lega
Зависит от использования, например если отзывы будут выводится на странице книги и больше с ними ничего не будет происходить, то их удобно сделать вложенными, + экономия на запросах, одним запросом будет доставаться книга и отзывы.
А вот авторов лучше (можно) в отдельную коллекцию, т.к. их данные будут изменятся (имя, фотка, описание, теги?), Хотя если эти изменения очень редкие или вовсе нет, то можно сделать вложенными, при этом будет больший расход диска, но экономия на запросах.
Ответ написан
@kaasius
Тут нужна разумная нормализация. Как писали выше, одна сущность - один документ. Но не забываем при этом, что излишнее дублирование информации (вроде автора) не есть хорошо. Ибо, если у автора что-то изменится, надо будет перелопачивать все документы с этим автором.

Прелесть schemaless именно в отсутствии схемы. То есть вы можете разным сущностям придать разные атрибуты, при этом держать все в одной коллекции и индексировать все эти атрибуты. Если же структура предполагается более регулярной, если схема будет присутствовать - то стоит обратиться к хранилищам со схемой.
Ответ написан
@lega
В будущем потребуется хранить и редактировать огромные объёмы информации

На счет объемов, у вас наверняка для книг будут картинки (постеры), дак вот они могут занимать большую часть хранилища (+ большую часть расхода), я работал с одним книжным сайтом - на каждую книгу с отзывами (~4kb) есть несколько картинок (~120kb), т.е. ~97% (от книг) это картинки.
Ответ написан
opium
@opium
Просто люблю качественно работать
Книги все таки хорошо ложатся в реляционную модель, зачем там монго?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы