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

Как хранить в одной таблице, ссылки на разные таблицы?

Допустим у меня есть таблицы для компонентов:
  • simple_text_component
  • simple_image_component
  • media_gallery_component

у каждой есть свои поля и свои записи.
Мне нужно создать еще одну таблицу components, в которой я буду хранить ссылки на записи из трех таблиц выше (их может быть и не три, а более в рамках роста проекта).

Идея в том, что я хочу в дальнейшем в одном запросе (или как можно оптимальнее) доставать по несколько компонентов из components. Как можно это сделать? Либо как спроектировать структуру таблиц удовлетворяющей решению такой задачи?
Пока в голову приходит что-то такое: хранить в таблице components id, тип компонента (строка, соответствует имени таблицы), далее делать запрос который извлечет все необходимые строки из components, потом на основе этих данных формировать запрос чтоб забрать все необходимые данные по каждому из компонентов, потом это маппить в необходимый формат и отдавай в контроллер. Выходит что будет два запроса.
Но такой вариант мне не очень нравится, предложите свое решение.
  • Вопрос задан
  • 884 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 3
inoise
@inoise
Solution Architect, AWS Certified, Serverless
На самом деле вполне себе решение. Вы на правильном пути. Не все можно сделать в один запрос. И не всегда надо
Ответ написан
Комментировать
vick
@vick
Пишу на RoR
Вот интро по полиморфные связи - https://habr.com/post/261835/
Ответ написан
Комментировать
@BorisKorobkov Куратор тега MySQL
Web developer
Можно и в один запрос:
FROM component_link
LEFT JOIN simple_text_component ON component_link.component_id = simple_text_component.id AND component_link.type = 'simple_text'
LEFT JOIN simple_image_component ON component_link.component_id = simple_image_component.id AND component_link.type = 'simple_image'

Только не забудьте правильно поставить индексы и проверить разные варианты через explain.
Ответ написан
Ваш ответ на вопрос

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

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