Как правильно спроектировать MYSQL для чата на node.js?

Всем привет.
Нужно сделать адекватный чат на node.js как часть приложения в котором будут свои плюшки присущие любому нормальному чату. На этой почве возникло пару вопросов:

1) Хранить историю чата в виде [отправитель] [получатель] [сообщение] [Дата и время] [было прочитано?] в MySQL BD целесообразно ли? Если чат будет очень популярен, не создаст ли это слишком высокую нагрузку на бд? А насчет количества записей которое там будет нарастать с огромной скоростью? Их нужно ведь будет еще парсить порой что бы загружать историю предыдущих сообщений между пользователями?

Если бы была возможна переписка только между 2 людьми, тогда предыдущий вариант хранения данных в БД отлично бы подошел, так как по id пользователя который отправил сообщение и по id пользователя который его получил + чтение с конца БД что бы было еще отсортировано по времени можно легко получать историю переписки 2-х людей.

2) А что если добавить возможность добавления людей в простой чат от чего он автоматически должен стать групповым? Как теперь лучше хранить сообщения из этого чата в БД если получателей теперь может быть много? И как с легкостью получить историю из этой динамически созданной группы участников?

И последний вопрос. Тут вроде полегче будет но все равно до конца не ясно.

3) В приложении уже существуют группы в которые пользователь может вступать. Группа это просто строка в БД в таблице groups у которой есть id, название и другие параметры. Нужно реализовать общий чат группы. Я себе это представляю так: в каждой группе в БД будет хранится массив айдишников пользователей которые состоят в этой группе в виде строки. Меня беспокоит размер этой строки с ростом популярности группы от чего это заставляет меня думать о том, что я что то делаю не так. Как это сделать правильно? Вдобавок если я буду так хранить список участников группы я не смогу нормально выполнять SELECT запрос по конкретному пользователю что бы получить массив групп в которых он состоит.
  • Вопрос задан
  • 1168 просмотров
Решения вопроса 1
zoonman
@zoonman
⋆⋆⋆⋆⋆
Вы неправильно рассматриваете систему чатов.
В чатах есть комнаты, внутри комнат сообщения и участники.
Тет-а-тет это приватная комната с 2-ми участникам.

room 
- id
- name
- private

participant (участник чата)
- id
- name

roster (список участников чата)
- room_id
- participant_id

history (история сообщений)
- id
- room_id
- participant_id
- timestamp
- type (тип сообщения, иногда нужны системные сообщения от ботов)
- text
- deleted


А теперь вперед - учить JOIN'ы!

По поводу нагрузки - при правильном проектировании приложения, нагрузка на базу будет минимальной, преимущественно проверки, кто принадлежит к какой комнате и запись в историю.
Сколько-нибудь значимая нагрузка будет при 10к человек онлайн. Поверьте, это очень большая посещаемость.
При большей посещаемости ваша проблема будет решена горизонтальным масштабированием (шардингом БД).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы