Предположим, у нас есть две сущности \ таблицы - Users и Games (вместо них может быть что угодно). И пользователь может отметить несколько игр как избранные. Таким образом, у нас также есть таблица user_favourite_game (user_id, game_id).
Тогда предположим, что пользователь выбирает список всех доступных игр, и некоторые из них должны иметь флаг «избранное» = true (используется разбиение на страницы, поэтому мы будем считать, что каждый раз выбирается 20 игр). Итак, я вижу здесь два подхода:
- Мы можем сделать один запрос, заполнив поле «избранное», e. г.
SELECT
g.*,
ufg.game_id IS NOT NULL AS favourite
FROM
games g LEFT JOIN
user_favourite_game ufg ON ufg.user_id = :userId AND g.id = ufg.game_id
ORDER BY
g.id;
- Мы можем выбрать игры, а затем выполнить 20 запросов, чтобы проверить, является ли игра избранным пользователем.
Какой подход лучше использовать и почему? Есть другие идеи?
В последнем проекте мы использовали второй подход из-за сложности вычислений, требуемых для каждой сущности. Так что это было намного сложнее, чем в примере выше, и было почти невозможно вычислить внутри одного запроса.
Но в целом мне кажется, что в таких простых случаях один запрос с JOIN должен выполняться быстрее, чем 20 простых запросов. Хотя я не уверен, как он будет себя вести, когда в таблице user_favourite_game будет много данных