Задать вопрос

MongoDB chat best way?

Мой первый опыт с mongodb. Я пока еще не одуплился, чтобы стать джедаем, и поэтому хочу спросить совета.
Необходимо сделать чат юзер-юзер, используя именно монгу. Сопутствующие технологии - nodejs, socket.io, но это не столь важно.
Начал думать над схемой документа, и над самими коллекциями. Гугл почему-то мне не помог. Может я просто плохо пытался, но кажется что нет.
Прикинув на листочке как это может быть выглядеть, накалякал такое:

collections:
users: {
    _id: login,
    userId: int
    name: str,
    avatar: str
}


userId - идентификатор в основной базе (mysql) юзера. Почему то в качестве _id моё нутро подсказало использовать именно login, а он уникальный. Может быть я ошибся ?

Далее:
dialogs: {
    precedents: [userId, userId],
    messages: [{
       date: ...,
       text: ...,
       sender: userId
    }]
}


И тут встал вопрос: правильно ли хранить сообщения в поле-массиве документа ? Как обстоят дела с производительностью при такой схеме ?
Вообще хотелось бы услышать советов, как лучше организовать хранение таких данных в mongo.
  • Вопрос задан
  • 4669 просмотров
Подписаться 6 Оценить Комментировать
Решения вопроса 2
@kaasius
И да, хранение логов пользователей в самих записях инцидента в виде массива имеет пару недостатков, которые могут показаться незначительными, но на деле они фатальны.

1. Размер записи в монге ограничен - сейчас это 16 мег.
2. В конкурентной среде достичь атомарности при такой записи у вас не получится. Будет race.

И да, я знаю, что вы скажете - 16 мег хватит всем, и такого интенсивного обмена, чтобы случился race, не возникнет. Я вам тогда напомню про 640 килобайт, и про закон Мерфи - если какая-нибудь неприятность может случиться - она обязательно случится.

Резюме - не делайте так.
Ответ написан
fornit1917
@fornit1917
Лучше каждое сообщение отдельной записью в коллекции делать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@kaasius
Вы ошиблись c выбором БД для своих целей. Совершенно непонятно, зачем тут нужна монга, какова цель. Чат юзер-юзер замечательно работает вообще без базы данных, я могу на nginx поднять чат юзер-юзер вообще без бэкенда. Если БД нужна, чтобы просто хранить логи общения, подойдет любая БД с буффером в виде быстрой очереди (если планируете высокую нагрузку) или вообще без буферизации дополнительной.

Ну и, да _id монге лучше дать делать самой.
Ответ написан
Ваш ответ на вопрос

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

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