Каков наилучший подход для извлечения флага, если объекты связаны? - PullRequest
0 голосов
/ 03 июня 2019

Предположим, у нас есть две сущности \ таблицы - Users и Games (вместо них может быть что угодно). И пользователь может отметить несколько игр как избранные. Таким образом, у нас также есть таблица user_favourite_game (user_id, game_id).

Тогда предположим, что пользователь выбирает список всех доступных игр, и некоторые из них должны иметь флаг «избранное» = true (используется разбиение на страницы, поэтому мы будем считать, что каждый раз выбирается 20 игр). Итак, я вижу здесь два подхода:

  1. Мы можем сделать один запрос, заполнив поле «избранное», 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;
  1. Мы можем выбрать игры, а затем выполнить 20 запросов, чтобы проверить, является ли игра избранным пользователем.

Какой подход лучше использовать и почему? Есть другие идеи?

В последнем проекте мы использовали второй подход из-за сложности вычислений, требуемых для каждой сущности. Так что это было намного сложнее, чем в примере выше, и было почти невозможно вычислить внутри одного запроса.

Но в целом мне кажется, что в таких простых случаях один запрос с JOIN должен выполняться быстрее, чем 20 простых запросов. Хотя я не уверен, как он будет себя вести, когда в таблице user_favourite_game будет много данных

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Используйте базу данных для того, для чего она предназначена, и она даст вам результаты как часть вашего исходного запроса.

Время, которое ваша БД потратит на выполнение внешнего соединения с пользовательской игровой таблицей, скорее всего, будетбыть меньше, чем нагрузка на сеть из 20 отдельных запросов для избранного флага.

Убедитесь, что таблицы проиндексированы соответствующим образом, поскольку они растут и имеют точную статистику.

Это не сложно и быстроПравило и фактическое тестирование производительности должны руководить, но я наблюдал множество приложений, которые пострадали от сетевой болтовни.Если ваша стоимость туда-обратно для каждого запроса составляет 250 мс, ваши 20 звонков будут очень дорогими.Если ваша поездка туда и обратно составляет 1 мс, люди могут никогда не заметить.

0 голосов
/ 03 июня 2019

Выполнение 20 запросов (независимо от того, насколько они просты) всегда будет замедлять работу вашего приложения. Факторы включают стоимость сети, выполнение запросов и т. Д.

Вы должны запустить один запрос, чтобы получить страницу доступных игр, а затем сделать другой запрос, чтобы получить список «любимых» игр этого пользователя, передав идентификаторы игр, присутствующих на этой странице. Затем установите / отмените флаг, зацикливая результат. Таким образом, вы сделаете только 2 вызова БД, и это значительно улучшит производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...