|
|
|
Подскажите как лучше организовать.
|
|||
|---|---|---|---|
|
#18+
Здравствуйте уважаемые мемберы, имеется такая схема(приатачена): табл data - где в иерархическом порядке хранятся некие данные(вложенность не более 6 уровней), табл rule - где хранятся права пользователей на некоторые узлы(право на узел означает что у пользователя есть право на сам узел и на все его дочерние узлы), сейчас для определения того есть ли у пользователя права на узел выполняется такой запрос (проверяем есть ли права на узел или на одного из его родителей) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. в обратную сторону(получить узлы на которые пользователь имеет права) запрос тоже не слишком хорош... вот и возник вопрос как это можно улучшить так чтобы запросы были более лёгкие? Пока единственная идея(подсмотрел где то на скуле) под каждый уровень в дереве резервировать диапазон ИД тогда зная что пользователь имеет права на такой то узел можно быстро получить все дочерние узлы простым условием id BETWEEN min_child_id AND max_child_id(картинка ниже). Может быть сообщество подскажет ещё какие нибудь способы упростить запросы по проверке прав на узлы и получения всех дочерних узлов, желательно более гибкие к размеру дерева? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2013, 17:54 |
|
||
|
Подскажите как лучше организовать.
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2013, 17:54 |
|
||
|
Подскажите как лучше организовать.
|
|||
|---|---|---|---|
|
#18+
дев чтобы запросы были более лёгкие Выделенное надо пояснить. Чтобы запросы были проще по синтаксису Чтобы план был проще Чтобы производительность была выше (за счет чего-либо другого) Навскидку 1 Если уровень вложения принципиально ограничен, то замените структуру id, parent_id на шесть таблиц lev1-lev6 2 Создайте материализованное представление Юзер-узел ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2013, 18:28 |
|
||
|
Подскажите как лучше организовать.
|
|||
|---|---|---|---|
|
#18+
девПока единственная идея(подсмотрел где то на скуле) под каждый уровень в дереве резервировать диапазон ИД тогда зная что пользователь имеет права на такой то узел можно быстро получить все дочерние узлы простым условием id BETWEEN min_child_id AND max_child_id(картинка ниже). Может быть сообщество подскажет ещё какие нибудь способы упростить запросы по проверке прав на узлы и получения всех дочерних узлов, желательно более гибкие к размеру дерева? JFUI, это [слегка извращенные] т.н. "Деревья Селко (Selko)". В оригинале они вполне гибкие к размеру дерева, но операции вставки временами получаются тяжелыми. Если это для Вас некритично - то можно пользоваться. Если нет - можно добавить денормализованный атрибут "путь до корня" (например, в виде строки родительских ID c разделителями, благо у Вас уровень вложенности ограничен и переполнения можно не опасаться). тогда проверка, является ли узел А родителем узла B, становится тривиальной - B.Path like A.Path + '%' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2013, 18:54 |
|
||
|
Подскажите как лучше организовать.
|
|||
|---|---|---|---|
|
#18+
Самый простой вариант - при добавление пользователю прав к узлу, сразу давать права на все дочерние. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2013, 13:46 |
|
||
|
Подскажите как лучше организовать.
|
|||
|---|---|---|---|
|
#18+
девМожет быть сообщество подскажет ещё какие нибудь способы упростить запросы по проверке прав на узлы и получения всех дочерних узлов, желательно более гибкие к размеру дерева? Например, я иногда делаю materialized view с данными "узел А является потомком узла Б". Довольно просто строится и резко упрощает любые подобные запросы - только стоит иметь в виду ожидаемое количество записей в такой вот табличке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2013, 17:17 |
|
||
|
Подскажите как лучше организовать.
|
|||
|---|---|---|---|
|
#18+
спасибо всем за предложенные варианты, после проверки разных способов остановились на этом способе softwarerНапример, я иногда делаю materialized view с данными "узел А является потомком узла Б". Довольно просто строится и резко упрощает любые подобные запросы - только стоит иметь в виду ожидаемое количество записей в такой вот табличке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2013, 11:03 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=38266956&tid=1541243]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
76ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
| others: | 242ms |
| total: | 424ms |

| 0 / 0 |
