Задача проектирования схемы БД Mongo - PullRequest
3 голосов
/ 20 сентября 2011

Я проектирую схему mongo db для сайта, подобного stackoverflow.Есть вопросы и пользователи.Пользователи могут добавлять вопросы в свой список избранных, и они могут искать вопрос в списке избранных.

У меня есть 2 коллекции, как пользователи и вопросы.Проблема в том, как хранить избранное.Есть 2 варианта

  1. Сохранение списка идентификаторов избранных вопросов у пользователя
  2. Сохранение списка идентификаторов пользователей (пользователей, добавивших этот вопрос в избранное), свопрос.

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

Для оценки размеров дБ / записи предположите количество вопросов, операций дб пользователей, которые имеет стековый поток

Для получения дополнительной информации;

Это приложение - asp.net mvc, написанное на c # и надеющееся использовать Lucene.NET для поиска

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 20 сентября 2011

Если вы разрабатываете сайт, подобный SO, и хотите добиться такой же производительности, вам наверняка понадобится денормализовать ваши данные.Итак, я предлагаю хранить идентификатор пользователя любимых вопросов внутри пользователя, а также хранить и хранить идентификатор пользователя внутри вопроса.Во время любимой операции вам потребуется вставить данные в двух местах (пользователь, вопрос), но вы сможете быстро восстановить избранное пользователя / вопроса.

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

Если вам нужен настоящий полнотекстовый поиск, вы можете попробовать RavenDB .Это также отличная база данных nosql и встроенная поддержка синтаксиса Lucene.

Редактировать:

При разработке сайта, подобного SO, помните:

  1. денормализация
  2. асинхронная обработка запросов
  3. фоновые задания
1 голос
/ 20 сентября 2011

У отдельной коллекции для UserFavories лучше подходить. Потому что размер фаворитов в любое время неизвестен, и он продолжает расти

       UserFavories
                -UserID (BSON Objectid)
                - id of the user who posted
                - Name of the user who posted
                - Name of the question
                - Question id
                - url to the question

Мы думаем, что для сохранения идентификатора пользователя будет достаточно идентификатора вопроса. Но в non sql лучше хранить очень важную информацию вместе с идентификаторами (избегайте объединений). В этом случае вы сохраняете идентификатор и имя пользователя, который разместил вопрос и имя, идентификатор и URL-адрес вопроса, поэтому вы легко можете отобразить избранное, просто запросив этот документ в одиночку, например,

enter image description here

это не точный способ сделать это, но это даст вам идею ..

0 голосов
/ 20 сентября 2011

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

...