Таблица запросов с использованием нескольких внешних ключей - PullRequest
0 голосов
/ 01 ноября 2019

Так что я просто бездельничаю с приложением NodeJS и пытаюсь реализовать систему разрешений, используя мою базу данных.
Я впервые работаю с любой средой SQL, поэтому, пожалуйста, исправьте меня, если яЯ делаю что-то ужасно неправильно.
У меня есть следующие таблицы:

permissions:
  id,
  name

users:
  id,
  name

roles:
  id,
  name

user_permissions:
  id,
  user_id,
  permissions_id

role_permissions:
  id,
  role_id,
  permission_id

user_roles:
  id,
  user_id,
  role_id

Таким образом, есть 2 способа, которыми пользователь может получить разрешение, либо через роль, назначенную в user_roles, либо напрямую через user_permissions.

Я уже получил следующий запрос, который, кажется, работает правильно.

SELECT permissions.name 
FROM permissions 
INNER JOIN role_permissions ON role_permissions.permission_id=permissions.id 
INNER JOIN user_roles ON user_roles.role_id=role_permissions.role_id 
AND user_roles.user_id=?

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

Всякий раз, когда я пытаюсь выполнить следующий запрос

SELECT * FROM permissions INNER JOIN user_permissions ON user_permissions.user_id=?;

, я получаю:

+----+-------------+----+---------+---------------+
| id | name        | id | user_id | permission_id |
+----+-------------+----+---------+---------------+
|  1 | permission1 |  1 |       3 |             5 |
|  2 | permission2 |  1 |       3 |             5 |
|  3 | permission3 |  1 |       3 |             5 |
|  4 | permission4 |  1 |       3 |             5 |
|  5 | permission5 |  1 |       3 |             5 |
+----+-------------+----+---------+---------------+

Здесь у меня естьРазрешение 5 назначается как индивидуальное разрешение для пользователя 3, но из-за объединения оно присоединяется к каждому разрешению.

Так что, я думаю, я еще не до конца понял, что делает JOIN. Может быть, кто-нибудь мог бы помочь мне здесь и объяснить, что происходит?

1 Ответ

0 голосов
/ 01 ноября 2019

Вам не хватает объединения с user_permissions. Я думаю, что то, что вы после, будет что-то вроде следующего

 select p.name
 from permissions p
 join user_permissions up on up.permissions_id = p.permissions_id 
 join user u on u.user_id = up.user_id
 where u.user_id = ?
 union 
 select p.name
 from permissions p 
 join role_permissions rp on rp.permission_id = p.permission_id
 join user_roles ur on ur.role_id = rp.role_id
 join user u on u.user_id = ur.user_id 
 where u.user_id = ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...