Всем привет! Помогите пожалуйста разобраться ошибся ли я при проектировании или всеже это обычная структура.
На сайте имеется лента постов, пост может содержать 3 типа вложений (картинка, видео, gif анимация).
структура БД такая:
posts - таблица постов
images - таблица изображений
videos - таблица видео
gifi - таблица gif
При получении постов из БД я использовал примерно такой запрос.
Я получаю список постов и во вложенных запросах с помощью сепаратора отделяю нужные мне поля, которые на стороне php разбираю и собираю из них объект вложения. Почему не LEFT JOIN: "потому что пост может содержать более одного вложения каждого типа"
И вот тут у меня закрались сомнения... Что если бы у меня поддерживалось больше вложений. Запрос и так выглядит не эстетично. А учитывая то, что видео и, тем более, GIF содержатся в процентов 5 постов, то 95% запросов содержат лишние подзапросы для получения видео и GIF из БД.
Подскажите, нормальная ли это практика с такой кучей подзапросов или это все нужно собирать на стороне php запрашивая по отдельности каждый вариант вложения на основе предварительно полученных постов?
SELECT
`posts`.*,
(SELECT GROUP_CONCAT(CONCAT(`images`.`id`,':',`images`.`name`) SEPARATOR ',') FROM `images` WHERE `images`.`post_id` = `posts`.`id`) images
(SELECT GROUP_CONCAT(CONCAT(`videos`.`id`,':',`videos`.`name`) SEPARATOR ',') FROM `videos` WHERE `videos`.`post_id` = `posts`.`id`) videos
(SELECT GROUP_CONCAT(CONCAT(`gifi`.`id`,':',`gifi`.`name`) SEPARATOR ',') FROM `gifi` WHERE `gifi`.`post_id` = `posts`.`id`) gifi
FROM `posts`
LEFT JOIN `` ON