Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Подскажите как лучше организовать. / 7 сообщений из 7, страница 1 из 1
21.05.2013, 17:54
    #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
21.05.2013, 17:54
    #38266956
дев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как лучше организовать.
...
Рейтинг: 0 / 0
21.05.2013, 18:28
    #38267036
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как лучше организовать.
дев чтобы запросы были более лёгкие Выделенное надо пояснить.
Чтобы запросы были проще по синтаксису
Чтобы план был проще
Чтобы производительность была выше (за счет чего-либо другого)

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

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

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

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

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


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