Мы используем Postgres для модели разрешений RBA C с группами и пытаемся подумать о лучших необходимых индексах, предполагая, что наша БД имеет следующую схему:
Таблица субъектов
id, external_type, external_id, group_id
Таблица ресурсов
id, group_id, external_type, external_id, role_id
Обе таблицы предназначены для ответа на один вопрос:
Можно тема [S] выполнить действие [A] на ресурсе [R]
Итак, нам нужно получить все роли, которые пользователь имеет на ресурс, из всех групп разрешений, в которых он участвует.
- A субъект может иметь K строк в таблице субъектов, по одной для каждой группы, членом которой он является.
- Ресурс может иметь M строк в таблице ресурсов, по одной для каждой группы, для которой этому ресурсу была назначена роль.
- Мы решили денормализовать ресурсы, группы и роли в одна таблица для оптимизации чтения.
- Мы решили не денормализовать предметы в той же таблице - чтобы избежать u pdating много записей при каждом изменении структуры группы.
- И K, и M могут быть очень большими - пользователь может быть во многих группах, а ресурс может принадлежать многим группам.
Таким образом, запрос будет:
SELECT role_id
FROM resources
INNER JOIN subjects
ON resources.group_id=subjects.group_id
WHERE subjects.external_type="user" AND subjects.external_id=123
AND resources.external_type="order" AND resources.external_id=456
Мы решили определить следующие индексы:
Subjects: <external_type, external_id>, <group_id>
Resources: <external_type, external_id>, <group_id>
Может кто-нибудь, пожалуйста, объясните, как внутреннее соединение с предложением where
относится к 2 таблицам. индексы? Выполняются ли они параллельно, а затем соединяются оператором ON
, или только индексы одной таблицы будут использоваться для where
, а затем подключены с помощью соединения ON
?
Следует ли использовать разные составные индексы? как-то добавить group_id
к составным индексам?
Любая ссылка на аналогичный вариант использования или выбор индексов для сложных JOIN
запросов будут полезны.