|
|
|
Как преобразовать ltree-структуру во вложенное множество в PostgreSQL?
|
|||
|---|---|---|---|
|
#18+
Добрый день. Я бы хотел спросить о возможности преобразования таблицы PostgreSQL, в которой используется структура ltree в таблицу со структурой вложенных множеств, где для каждого узла определены левая и правая границы. Можно ли это как-то сделать используя представления? Например, у меня есть таблица в которой существует структура как на картинке: Объявление таблицы Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. И мне необходимо преобразовать это табличное представление в следующее: Код: sql 1. , где левая и правая граница узла соответствует правилам определения вложенного множества. У меня сейчас крутится идея вокруг такого представления. Оно позволяет получить данные о вершине, на каком уровне она находится и её порядковый номер на уровне. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Но что делать, дальше, понять не могу (как установить границы "A" left = 1, right = 16, "B" left = 2, right = 9 и т.д.) Может кто-нибудь подсказать идею? Решение должно быть с использованием только представлений или обобщенных табличных выражений. Заранее благодарю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2015, 23:10 |
|
||
|
Как преобразовать ltree-структуру во вложенное множество в PostgreSQL?
|
|||
|---|---|---|---|
|
#18+
Хранить дерево ltreёй при наличии рекурсивного sql выглядит странно ввиду избыточности. Посему предлагаю решение применительно к реляционным обычаям: таблица tr с полями a - ид, b - ссылка на a. Циклический обход с поворотом только направо разворачивает рекурсию в длинную цепочку с проходом нелистовых узлов дважды. Сиблинги организованы в последовательную цепочку lagом. С учетом еще и not-exists-заныривания в таблицу для определения листовых узлов, такой подход может работать крайне медленно на больших объемах. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2015, 03:45 |
|
||
|
Как преобразовать ltree-структуру во вложенное множество в PostgreSQL?
|
|||
|---|---|---|---|
|
#18+
p2., Спасибо большое за ответ. К сожалению, я не могу изменить структуру исходной таблицы. Есть исходная таблица, в которой отношение узлов между собой задано с помощью ltree. И стоит задача перенести это в таблицу, где отношения заданы с помощью вложенных множеств. К сожалению, у меня пока не получается придумать реализацию, как такой переход от ltree к nested sets можно сделать с помощью рекурсивного представления/CTE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2015, 11:06 |
|
||
|
Как преобразовать ltree-структуру во вложенное множество в PostgreSQL?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2015, 13:25 |
|
||
|
Как преобразовать ltree-структуру во вложенное множество в PostgreSQL?
|
|||
|---|---|---|---|
|
#18+
Ashot Takievне могу изменить структуру исходной таблицыспособ хранения связей на методику обхода не влияет, только на оператор, проверяющий связь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2015, 13:41 |
|
||
|
Как преобразовать ltree-структуру во вложенное множество в PostgreSQL?
|
|||
|---|---|---|---|
|
#18+
p2., Я не очень понимаю, что происходит внутри рекурсии применительно к ltree: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. Буду признателен, если поможете разобраться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2015, 14:29 |
|
||
|
Как преобразовать ltree-структуру во вложенное множество в PostgreSQL?
|
|||
|---|---|---|---|
|
#18+
Ashot Takiev -- здесь, насколько я понимаю, если вершина из x является левым предком вершины из t. -- не очень понимаю, как такое можно сделать в ltree, разве что упорядочить по path к проблеме отцы и дети инцест брата с сестрой никакого отношения не имеет. это row_number нумерация в твоих попытках или связанный список в моих: select a, b, lag(a) over(partition by b order by a) la, lead(a) over(partition by b order by a) ra from tr ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2015, 15:53 |
|
||
|
Как преобразовать ltree-структуру во вложенное множество в PostgreSQL?
|
|||
|---|---|---|---|
|
#18+
p2., я не понимаю, как для ltree так дерево развернуть. Нерекурсивная база понятна — берем элемент, у которого путь пустой. А дальше как? По идее, можно было бы сначала проиндексировать вершины, отсортировав по значению path (тем самым мы бы получили номера узлов при DFS обходе). А как быть с правыми индексами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2015, 17:38 |
|
||
|
Как преобразовать ltree-структуру во вложенное множество в PostgreSQL?
|
|||
|---|---|---|---|
|
#18+
В итоге сделал так (без мудреных рекурсий и прочего): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2015, 10:55 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=39101982&tid=1997639]: |
0ms |
get settings: |
9ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
158ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
27ms |
get tp. blocked users: |
1ms |
| others: | 275ms |
| total: | 491ms |

| 0 / 0 |
