Можно ли уместить сложную логику в один запрос БД?
Привет!
Я в образовательных целях делаю некоторую приложеньку.
Суть - есть автор, автор пишет пост, пост можно просмотреть другим и прокомментировать.
Посмотреть и прокомментировать могут либо все, либо определенные (зарегистрированные) участники объединенные в группы.
Задача - определить - можно ли показывать\принимать комментарии от конкретного пользователя.
(приложенька работает через REST, поэтому комментарии надо проверять отдельно от самого поста)
Примерная структура БД: User
id | name | token
Post
id | text | authorID
Group
id | name | authorID
GroupUser
id | userID | groupID
PostAllowGroup
id | postID | groupID
Comment
id | text | authorID | postID
Дальше алгоритм такой:
1 получаем запрос от клиента с токеном и postID (на комменты)
2 идем в User и берем id которому соответствует токен
3 идем в PostAllowGroup и выбираем те groupID, в которых есть наш postID
4 идем в GroupUser и смотрим, есть ли поля где groupID соответствует userID из второго пункта
5 если все ок, то отдаем коммент(ы) по postID сделав JOIN c User по authorID
Можно ли всю эту логику уместить в один запрос к базе?
И будет ли это быстрее, чем делать много простых запросов?
Просто на данный момент мне ума хватает всю эту логику я реализовать цепочкой запросов (как в алгоритме)
База данных MySQL или Postgres
Спасибо!
Можно использовать вот єтот инструмент чтобы расшаривать людям свои наброски sqlfiddle.com/#!17
В Постгри большой грамотно составленный запрос работает быстрее чем много маленьких, про MySQL не скажу.
Но делать так не надо. Для того, чтобы это стало очевидным, достаточно представить себе еще пару функций, устроенных аналогичным образом и необходимость внести в логику авторизации некое изменение, специфичное для каждой функции.
В описанном ТС случае нужен единственный бинарный ответ - так нехай sql перемолотит простенький запрос и вернет тот самый битовый ответ, а не гоняет туда-обратно море шелухи.
И авторизация - тут вообще не к месту. Ибо тут всего лишь ответ да/нет на пару userId и postId
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.