Serezhka
@Serezhka

Можно ли уместить сложную логику в один запрос БД?

Привет!
Я в образовательных целях делаю некоторую приложеньку.
Суть - есть автор, автор пишет пост, пост можно просмотреть другим и прокомментировать.
Посмотреть и прокомментировать могут либо все, либо определенные (зарегистрированные) участники объединенные в группы.
Задача - определить - можно ли показывать\принимать комментарии от конкретного пользователя.
(приложенька работает через 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
Спасибо!
  • Вопрос задан
  • 1323 просмотра
Пригласить эксперта
Ответы на вопрос 4
@ynblpb_spb
дятел php
Моя практика показывает, что правильнее разбивать сложные запросы на несколько мелких с хорошо просчитанными индексами в БД. Такая схема зачастую работает быстрее.
Ответ написан
@d-stream
Готовые решения - не подаю, но...
Можно ли всю эту логику уместить в один запрос к базе?
да
И будет ли это быстрее, чем делать много простых запросов?
да
Ответ написан
voronkovich
@voronkovich
Задача - определить - можно ли показывать\принимать комментарии от конкретного пользователя.


Это - задача авторизации пользователя (определение его прав). Не стоит смешивать ее с задачей извлечения данных (выборкой). Поэтому, с точки зрения архитектуры, лучше сделать хотя бы 2 запроса: первый - авторизация, второй - выборка.

И будет ли это быстрее, чем делать много простых запросов?


Это зависит от запроса. Но, в вашем случае, оптимизация - излишня, т. к. вы делаете приложение в образовательных целях.

В общем, на мой взгляд, несколько маленьких запросов - наиболее подходящий вариант для вас.
Ответ написан
Комментировать
@sAndreas
Юзер
Многое зависит от того как выставлены индексы и как напишете запрос. Если строк в таблицах много, если правильно выстроены индексы, и важна скорость выполнения, и не нужна наглядность самого кода(я так и не понял - сам запрос тоже в образовательных целях или только результат работы программы), то лучше писать в один запрос, естественно придётся его "полировать"(или переделывать запрос смотря на результат или смотреть "план запроса"). А если там строк немного и потом кто то будет смотреть/править Ваш код - то лучше писать небольшие запросы с комментариями.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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