MySQL оптимизирует проверку прав доступа пользователя - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть база данных MySQL 5.7. ПОЛЬЗОВАТЕЛЬ может ПОДПИСАТЬСЯ на КАНАЛ, который содержит МЕСТА. Итак, есть схема БД:

channels (TABLE)
  id INT UNSIGNED(10)
  name VARCHAR(256)

places (TABLE)
  id INT UNSIGNED(10)
  name VARCHAR(256)
  channelId INT UNSIGNED(10)

subscriptions (TABLE)
  id INT UNSIGNED(10)
  name VARCHAR(256)
  userId INT UNSIGNED(10)
  channelId INT UNSIGNED(10)

users (TABLE)
  id INT UNSIGNED(10)
  name VARCHAR(256)

У меня есть API для получения информации о месте. Пользователь спрашивает свои учетные данные для placeId, я проверяю его учетные данные.

Тогда я получаю идентификатор канала

SELECT channelId FROM places WHERE id = *inputId*;

Наконец, с помощью userId я проверяю, подписан ли он на канал

SELECT * FROM subscriptions WHERE channelId = *channelId* AND userId = *userId*;

Я получил идентификатор канала по предыдущему запросу и идентификатор пользователя по первому, когда я проверял его учетные данные. В конце делает 3 запроса, 3 выбирают.

Есть ли другой эффективный способ сделать это? Я не очень разбираюсь в JOIN, но если это может сделать систему более эффективной, то, пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 27 апреля 2018

Вы можете попробовать следующее соединение:

SELECT s.*
FROM subscriptions s
INNER JOIN places p
    ON s.channelId = p.channelId
WHERE
    p.id = <input> AND
    s.userId = <input>;

Если я правильно прочитал ваш вопрос, то channelId на самом деле не является вводом, а id таблицы places является вводом.

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