Смоделируйте сайт вопросов и ответов в mongoDB - PullRequest
2 голосов
/ 03 июля 2011

Мне нужно смоделировать сайт вопросов и ответов, такой как stackoverflow, в mongoDB, вот мои основные проблемы.

У меня есть 2 основных объекта - Вопросы и пользователи (просто забудьте другие, такие как ответы и т.д. ...),

Пользователи задают вопросы.Мне нужно отображать пользователя с вопросом всегда.Можно искать вопросы и просматривать все вопросы.Можно с уверенностью сказать, что пользователь задаст менее 1000 вопросов.

Пользователи имеют репутацию, которая часто обновляется, и текущая репутация должна постоянно отображаться с вопросом.

Решение 1: встроить пользователей в вопросы -

нет необходимости выполнять объединение, но при изменении репутации пользователей все соответствующие вопросы должны быть обновлены.И непросто отобразить отдельных пользователей

Решение 2: Моделировать пользователей и вопросы как отдельную коллекцию (как в СУБД) -

теперь обновление репутации не является проблемойНО нужно объединять пользователей и задавать вопросы каждый раз, когда вопрос получен.Прямо как в RDBMS.Более того, mongoDB не имеет объединений, а объединение - это фактически 2 вызова - 1 для получения вопроса и 1 для получения пользователя, поэтому, если нужно получить 100 вопросов, будет 100 вызовов для получения 100 отдельных пользователей - НЕ ХОРОШО.

Soluion 3: встроить пользователей в вопросы и создать отдельную коллекцию для пользователей.

При обновлении обновлять коллекцию пользователей и встроенных пользователей при отображениитолько пользователь - используйте пользователей

Так какой из них я должен использовать?или это лучше всего решать с помощью СУБД, такой как MySQL?И как быстро обновляются поля в mongoDB?

Я бы хотел использовать mongo из-за его скорости и простоты маршрутизации запросов на чтение к репликам и шардингу (ЕСЛИ мой сайт вырос из одного сервера, что маловероятнов любом случае; ()

Ответы [ 2 ]

3 голосов
/ 04 июля 2011

Решение 1 мне кажется незавершенным, потому что в любом случае у вас должно быть хранилище всех пользователей.

Решение 2 Также может быть решением, и оно, вероятно, будет лучше, чем любая rdbms, потому что в базе данных документов вы не можете сделать «реальное» объединение, а это означает, что вы можете легко масштабировать свою систему .

В случае, если ваша система не будет такой большой, как SO, просто выберите Solution # 2.

Решение 3 Вам не нужно встраивать в вопрос всю пользовательскую информацию, просто вставьте информацию, которую вам нужно отобразить.

Так что лучшим решением для системы с высокой масштабируемостью будет:

Users - первичное хранилище всей пользовательской информации, кроме того, здесь вы можете иметь количество вопросов, репутацию, количество ответов и любые статистические данные, которые вам нужны

Questions {ShortUserInfo {UserName, Reputation, GoldBadgetsCount, ...} } - хранилище вопросов с информацией, связанной с пользователем, которую вам нужно отобразить

Answers к конкретному вопросу, также должны быть включены в вопрос. И, вероятно, также будет содержать ShortUserInfo (или около того).

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

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

0 голосов
/ 03 июля 2011

Есть разные способы сделать это, но я бы, наверное, - коллекция пользователей - сборник вопросов. в вопросном документе я бы вставил массив объектов ответа

Существуют презентации по дизайну схем и видео, которые могут оказаться полезными.

...