По крайней мере, Oracle может выполнять иерархических запросов .Рассмотрим пример ролей пользователей БД:
CREATE TABLE my_dba_role_privs(
grantee VARCHAR2(30),
granted_role VARCHAR2(30)
);
-- assigning roles to roles
INSERT INTO my_dba_role_privs( grantee, granted_role ) VALUES('CLIENT', 'SELECT_ORDERS');
INSERT INTO my_dba_role_privs( grantee, granted_role ) VALUES('COMMERCIAL_DEP', 'CREATE_ORDERS');
INSERT INTO my_dba_role_privs( grantee, granted_role ) VALUES('COMMERCIAL_DEP', 'CLIENT');
-- assigning roles to users
INSERT INTO my_dba_role_privs( grantee, granted_role ) VALUES('CL_MATT', 'CLIENT');
INSERT INTO my_dba_role_privs( grantee, granted_role ) VALUES('CL_JOHN', 'CLIENT');
INSERT INTO my_dba_role_privs( grantee, granted_role ) VALUES('CM_MARY', 'COMMERCIAL_DEP');
Теперь выберите все роли пользователя 'CM_MARY':
SELECT DISTINCT GRANTED_ROLE role_name
FROM my_dba_role_privs
START WITH GRANTEE = 'CM_MARY'
CONNECT BY GRANTEE = PRIOR GRANTED_ROLE;
Результат:
COMMERCIAL_DEP
CREATE_ORDERS
CLIENT
SELECT_ORDERS
Выбор всех ролей и пользователей, которым принадлежит роль 'CLIENT'
SELECT GRANTEE role_name
FROM my_dba_role_privs
START WITH GRANTED_ROLE = 'CLIENT'
CONNECT BY GRANTED_ROLE = PRIOR GRANTEE;
Результат:
CL_JOHN
CL_MATT
COMMERCIAL_DEP
CM_MARY
ОБНОВЛЕНИЕ:
Поскольку вы упомянули, дерево будет довольно статичным, может быть интересно попробовать Деревья Джо Селко (примерно 180 строк для чтения).Это не требует самостоятельных соединений вообще!Итак, я ожидаю, что он будет работать в разы быстрее, чем CONNECT BY.Хотя я только что прочитал об этом всего 30 минут назад и не знаю, насколько он хорош в реальном мире
Обновление 2:"Модели с вложенным множеством" с MySQL: Управление иерархическими данными в MySQL Это то же самое, что и «Деревья Джо Селко» выше, но с большим количеством примеров и объяснений.