Существует ли универсальная структура БД для обмена сообщениями?

В целях самообучения клепаю свой велосипед на PHP.
Сейчас внедряю функционал обмена сообщениями.
Хочу создать более-менее универсальную структуру БД (на MYSQL для начала) для разных видов переписок: диалоги, чаты, группы, комментарии к статьям и т.д.
Начитавшись разных советов и примеров, накидал такую структуру БД.
5cb04c303ad62073382143.png
Количество таблиц может показаться избыточным, но моя задача - наиболее универсальная структура для любого возможного расширения функционала без необходимости менять структуру БД.
Кратко по таблицам:
1. users - список пользователей
2. chats - список всех чатов с указанием типа (диалог, чат, комментарии и т.д.)
3. chatprop - свойство чата (название, картинка, закреплённоё сообщение, возможность лайкать сообщения и т.д.)
4. chatmembers - участники чата. Статус: админ, участник, читатель, вышел из чата и т.д.
5. messages - список сообщений с указанием чата, автора и даты создания
6. messagecontent - содержимое сообщения (текст, картинки, файлы, ссылки, опросы и т.д.), на одно сообщение может быть несколько вложений, потому вынес в отдельную таблицу, хотя в простом случае можно объединить с таблицей messages. Сюда же можно добавлять лайки-дизлайки к сообщениям
7. messagetouser - Привязка сообщений к пользователям с указанием прочитанности и удаления из истории. Сюда попадают сообщения в зависимости от типа чата, например комментарии к статьям/записям сюда не добавляются.

Наиболее нагруженные последние 3 таблицы, с возможным ростом нагрузки можно предусмотреть разнос этих таблиц на разные сервера или дробление всех трех с разнесением самых активных чатов по разным серверам.

Есть какие советы по улучшению/оптимизации структуры БД?
  • Вопрос задан
  • 918 просмотров
Пригласить эксперта
Ответы на вопрос 1
Lexxtor
@Lexxtor
PHP, Yii2, Android
Согласен с mindtester.
А еще нейминг плохой. Все названия таблиц надо писать в единственном числе и без сокращений (user, chat_property и т.д.). Вместо chatmessage_id надо message_id - так будет понятнее, что это ссылка на поле id в таблице message.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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