powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Подскажите как лучше организовать.
7 сообщений из 7, страница 1 из 1
Подскажите как лучше организовать.
    #38266955
дев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте уважаемые мемберы, имеется такая схема(приатачена): табл data - где в иерархическом порядке хранятся некие данные(вложенность не более 6 уровней), табл rule - где хранятся права пользователей на некоторые узлы(право на узел означает что у пользователя есть право на сам узел и на все его дочерние узлы), сейчас для определения того есть ли у пользователя права на узел выполняется такой запрос (проверяем есть ли права на узел или на одного из его родителей)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT *
  FROM DATA t
 WHERE t.id = :ID /* проверяемый узел */
   AND EXISTS ( SELECT 1
                  FROM data d
                 WHERE d.id IN ( SELECT r.data_id
                                   FROM rule r 
                                  WHERE r.user_id = :USER /* наш пользователь */)
                   AND ROWNUM <= 1                  
                 START WITH d.id = :ID /* проверяемый узел */
                CONNECT BY PRIOR d.parent_id = d.id )



в обратную сторону(получить узлы на которые пользователь имеет права) запрос тоже не слишком хорош... вот и возник вопрос как это можно улучшить так чтобы запросы были более лёгкие?

Пока единственная идея(подсмотрел где то на скуле) под каждый уровень в дереве резервировать диапазон ИД тогда зная что пользователь имеет права на такой то узел можно быстро получить все дочерние узлы простым условием id BETWEEN min_child_id AND max_child_id(картинка ниже).

Может быть сообщество подскажет ещё какие нибудь способы упростить запросы по проверке прав на узлы и получения всех дочерних узлов, желательно более гибкие к размеру дерева?
...
Рейтинг: 0 / 0
Подскажите как лучше организовать.
    #38266956
дев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Подскажите как лучше организовать.
    #38267036
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дев чтобы запросы были более лёгкие Выделенное надо пояснить.
Чтобы запросы были проще по синтаксису
Чтобы план был проще
Чтобы производительность была выше (за счет чего-либо другого)

Навскидку
1 Если уровень вложения принципиально ограничен, то замените структуру id, parent_id на шесть таблиц lev1-lev6
2 Создайте материализованное представление Юзер-узел
...
Рейтинг: 0 / 0
Подскажите как лучше организовать.
    #38267096
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
девПока единственная идея(подсмотрел где то на скуле) под каждый уровень в дереве резервировать диапазон ИД тогда зная что пользователь имеет права на такой то узел можно быстро получить все дочерние узлы простым условием id BETWEEN min_child_id AND max_child_id(картинка ниже).

Может быть сообщество подскажет ещё какие нибудь способы упростить запросы по проверке прав на узлы и получения всех дочерних узлов, желательно более гибкие к размеру дерева?

JFUI, это [слегка извращенные] т.н. "Деревья Селко (Selko)". В оригинале они вполне гибкие к размеру дерева, но операции вставки временами получаются тяжелыми. Если это для Вас некритично - то можно пользоваться.

Если нет - можно добавить денормализованный атрибут "путь до корня" (например, в виде строки родительских ID c разделителями, благо у Вас уровень вложенности ограничен и переполнения можно не опасаться). тогда проверка, является ли узел А родителем узла B, становится тривиальной - B.Path like A.Path + '%'
...
Рейтинг: 0 / 0
Подскажите как лучше организовать.
    #38268237
Kvazar_Old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Самый простой вариант - при добавление пользователю прав к узлу, сразу давать права на все дочерние.
...
Рейтинг: 0 / 0
Подскажите как лучше организовать.
    #38270505
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
девМожет быть сообщество подскажет ещё какие нибудь способы упростить запросы по проверке прав на узлы и получения всех дочерних узлов, желательно более гибкие к размеру дерева?
Например, я иногда делаю materialized view с данными "узел А является потомком узла Б". Довольно просто строится и резко упрощает любые подобные запросы - только стоит иметь в виду ожидаемое количество записей в такой вот табличке.
...
Рейтинг: 0 / 0
Подскажите как лучше организовать.
    #38281223
дев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо всем за предложенные варианты, после проверки разных способов остановились на этом способе

softwarerНапример, я иногда делаю materialized view с данными "узел А является потомком узла Б". Довольно просто строится и резко упрощает любые подобные запросы - только стоит иметь в виду ожидаемое количество записей в такой вот табличке.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Подскажите как лучше организовать.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]