Правильная структура бд для хранения сообщений, и где их лучше хранить?
Как лучше хранить пользовательские сообщения? Есть в голове пару форматов:
1 формат:
Таблица dialogs
id | from_user_id | to_user_id
Таблица messages
id | dialog_id | date
Таблица content_message:
id | message_id | message_content
Таблица attachment
id | message_id | path_to_file
Формат 2:
Таблица message:
id | from_user_id | to_user_id | date | message | attachment
Какой есть корректным? По итогу нужна сразу нормальная структура, чтобы когда проект рос, это не надо было переписывать в корректный формат.
Также вопрос, на каком моменте (сколько сообщений должно быть, нагрузка) чтобы думать о таких понятиях как шардинг? И всегда ли надо держать это в бд, может потом надо переносить на системы полнотекстового помска на подобии эластика, солра, сфинкса? Где держат ЛС крупные социальные сети типа фб, вк, ок?
формат 2 подходит, сообщение это 1 сущность, не надо разбивать ее на подсущности, это ускорит работу с таблицей и немного упростит миграции и репликации. Возможно аттачмент стоит вынести в отдельную таблицу, так как не факт что завтра их не будет больше 1. Не хватает статуса прочтен и статуса удалено у какого-то пользователя.
По количеству - таблица считается большой от нескольких миллионов записей, скорость выборки зависит от кучи параметров, как железа так и структуры индексов/данных.