Как правильно вставить в таблицу M..N? - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть простая установка с 3 таблицами: Role, Permission и RolePermission.

Role:            | Permission:            | RolePermission:
ID    SysName    | ID    SysName          | Role    Permission
--    -------    | --    -------          | ----    ----------
 1    Admin      |  1    DoUserThings     |    1    1
 2    User       |  2    DoAdminThings    |    1    2
                 |  3    HackTheGibson    |    1    3
                                          |    2    1

Идея состоит в том, что роли и разрешения существуют отдельно, а таблица "RolePermission" назначаеткакие роли имеют какие разрешения.

В этом примере администраторы имеют все разрешения, а пользователи имеют разрешение DoUserThings.

Однако я не уверен, как правильно написать оператор INSERT.Я написал одну, которая запрашивает таблицу Role и Permission, но она не кажется самой производительной.Я рассматривал оператор JOIN, хотя я не уверен, к чему присоединяться.

Вот моя попытка:

INSERT INTO RolePermission (Role, Permission)
SELECT Role.ID, Permission.ID
FROM Role, Permission
WHERE
    Role.SysName == 'Admin'
    AND
    Permission.SysName == 'DoUserThings';

Это вставит 1, 2 в таблицу RolePermission.


Примечание. В настоящее время я использую SQLite для тестирования, но хотел бы быть совместимым с MySQL и / или PostgreSQL.

1 Ответ

3 голосов
/ 25 апреля 2019

Ваш метод в порядке, хотя я мог бы склоняться сформулировать его так:

INSERT INTO RolePermission (Role, Permission)
    SELECT r.ID, p.ID
    FROM Role r JOIN
         Permission p
         ON r.SysName = 'Admin' AND
            p.SysName = 'DoUserThings';

С точки зрения производительности, не имеет значения, как вы формулируете логику.Если вы заботитесь о производительности, добавьте индексы Role(SysName, Id) и Permission(SysName, Id).

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