powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Есть ли что-то похожаее на hierarchyid?
16 сообщений из 16, страница 1 из 1
Есть ли что-то похожаее на hierarchyid?
    #38951405
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой-то аналог SQL Server типа hierarchyid?

Чтобы поддерживать иерархию, прямые выборки из дерева и т.д.
...
Рейтинг: 0 / 0
Есть ли что-то похожаее на hierarchyid?
    #38951414
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ltree - аналог?
...
Рейтинг: 0 / 0
Есть ли что-то похожаее на hierarchyid?
    #38951967
uranic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В postgresql мне известно три способа работы с деревьями:
использование конструкции WITH RECURSIVE

Расширение ltree

Расширение tablefunc

У каждого свои плюсы и минусы. Если не найдете в документации, постараюсь разъяснить
...
Рейтинг: 0 / 0
Есть ли что-то похожаее на hierarchyid?
    #38952401
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uranicВ postgresql мне известно три способа работы с деревьями:
использование конструкции WITH RECURSIVE

Расширение ltree

Расширение tablefunc

У каждого свои плюсы и минусы. Если не найдете в документации, постараюсь разъяснить


Что-то нашел, что-то спросил.
Запросы - это одно, у них свои преимущества.
Но мне в данном случае нужна возможность хранения больших иерархий в таблице, по типу hierarhcyid в SQL Server. Ну и запросы к ним, апдейты, удаление, перенос поддеревьев.
Реально в таблице миллионы записей.
...
Рейтинг: 0 / 0
Есть ли что-то похожаее на hierarchyid?
    #38953117
ОКТОГЕН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuh,
а что непонятного в доке?
По видимому, лтре вам больше подойдёт
http://www.postgresql.org/docs/9.4/static/ltree.html
И индексирование по нему супер сделано.
Ишшо премерчег
http://habrahabr.ru/post/130371/
ЗЫ
Хотя у меня и id - id_parent миллионные таблички были.
...
Рейтинг: 0 / 0
Есть ли что-то похожаее на hierarchyid?
    #38955609
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОКТОГЕНWinnipuh,
а что непонятного в доке?
По видимому, лтре вам больше подойдёт
http://www.postgresql.org/docs/9.4/static/ltree.html
И индексирование по нему супер сделано.
Ишшо премерчег
http://habrahabr.ru/post/130371/
ЗЫ
Хотя у меня и id - id_parent миллионные таблички были.

вот, речь как раз о миллионных таблицах.

Как по скорости делается re-parent? т.е. перевешивание поддерева к другому паренту?
...
Рейтинг: 0 / 0
Есть ли что-то похожаее на hierarchyid?
    #38955649
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuh,

если перевешивание у вас частая операция, и длина/развесистость веток значительная -- берите стандртный рекурсивный способ и не мучайтесь. [а то много почти пустых страниц в индексе поимеете -- придется реиндексить время от времени]

ну, проиграете немного на скорости выборок ("рекурсивный" index -- seek по REFERENCE parentid(id)) -- это не суть важно. у вас есть 1000-е и более по глубине [level] ветки ?
...
Рейтинг: 0 / 0
Есть ли что-то похожаее на hierarchyid?
    #38955656
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

да , кстати, данное листа у вас лежит в той же таблице структуры ? (в чом есть смысл для запросов -- можно составные индексы вдоль структуры и данного)
и данное это -- развесистое (много кило/мегабайтное) ?

-- если да -- то массовый апдейт структуры приводит к массовому перемещению данного в новые версии. т.ч. тут оптимум надо искать меж возможностью сложных поисковых индексов по структуре и полям данных [когда всё вместе], и затратностью на передвигание листьев [какую можно снять отделив данные листьев в отдельную таблу[что порождает дополнительные джойны и сложности уже при массовом выборе листьев по структуре]].
...
Рейтинг: 0 / 0
Есть ли что-то похожаее на hierarchyid?
    #38956164
ОКТОГЕН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuh,
Кстати, забыл про ограничения ltree:
1)Уровень вложенности не более 255(или 256)
2)метки только ASCII тоже ограниченной длинны
id - id_parent
По скорости чтобы кусок дерева перевесить на другого родича достаточно переназначить его id_parent
Очень быстрая операция. Самая быстрая, наверное в этом методе.
Медленнее - скопировать этот кусок дерева, но тоже ничего сложного особо.
первым запросом создаётся времянка - что копировать.
Вторым - расставляются новые id_parent в ней
Третьим задаётся родитель верхнего уровня.
Потом выгружается в основную таблицу и всё.
Удаление - через foreign key каскадно.
Проблем быть не должно, главное, чтобы по id - id_parent существовали индексы.
Это в самом общем случае.
Как-то так.
...
Рейтинг: 0 / 0
Есть ли что-то похожаее на hierarchyid?
    #38956623
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqWinnipuh,

если перевешивание у вас частая операция, и длина/развесистость веток значительная -- берите стандртный рекурсивный способ и не мучайтесь. [а то много почти пустых страниц в индексе поимеете -- придется реиндексить время от времени]

ну, проиграете немного на скорости выборок ("рекурсивный" index -- seek по REFERENCE parentid(id)) -- это не суть важно. у вас есть 1000-е и более по глубине [level] ветки ?

Операция перевешивания не частая, да и вложенности макс 128 уровней, и то это редко.
...
Рейтинг: 0 / 0
Есть ли что-то похожаее на hierarchyid?
    #38957002
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел здесь простой пример, вникаю

http://leopard.in.ua/2013/09/02/postgresql-ltree/


Вопрос:
есть такие запросы

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
-- 1)Find all direct childrens for parent '0001.0003':
SELECT user_id, path FROM comments WHERE path ~ '0001.0003.*{1}' ORDER by path;

--2)Find all childrens for parent '0001.0003':
SELECT user_id, path FROM comments WHERE path ~ '0001.0003.*' ORDER by path;

--3)Find parent for children '0001.0003.0002.0002.0005':
SELECT user_id, path FROM comments WHERE path = subpath('0001.0003.0002.0002.0005', 0, -1) ORDER by path;



Как будет выглядеть запрос (3+2), то есть "Найти всех чилдренов для найденного парента для указанного чилда?"
То есть: найти всех братьев указанного чилда
...
Рейтинг: 0 / 0
Есть ли что-то похожаее на hierarchyid?
    #38957019
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой сделал запрос, но не работает

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT user_id, path FROM comments 
WHERE path ~ 
(
SELECT ltree2text(path) || '.*' FROM comments WHERE path = subpath('0001.0003.0002.0002.0005', 0, -1)
)
ORDER by path;

ERROR:  operator does not exist: ltree ~ text
LINE 1: SELECT user_id, path FROM comments WHERE path ~ ( SELECT ltr...
                                                      ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
...
Рейтинг: 0 / 0
Есть ли что-то похожаее на hierarchyid?
    #38957026
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, внутренний запрос

такой работает, но здесь возвращается text:
Код: sql
1.
SELECT ltree2text(path) || '.*' FROM comments WHERE path = subpath('0001.0003.0002.0002.0005', 0, -1)



такой не работает: ошибка в позиции 20
Код: sql
1.
SELECT text2ltree(ltree2text(path) || '.*') FROM comments WHERE path = subpath('0001.0003.0002.0002.0005', 0, -1)
...
Рейтинг: 0 / 0
Есть ли что-то похожаее на hierarchyid?
    #38957113
ОКТОГЕН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
SELECT user_id, path FROM comments
 WHERE path <@ subpath('0001.0003.0002.0002.0005', 0, -1);
...
Рейтинг: 0 / 0
Есть ли что-то похожаее на hierarchyid?
    #38957116
ОКТОГЕН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuh,
А это чисто всех братьев без родича
Код: sql
1.
2.
3.
4.
5.
SELECT c.*
FROM comments c
WHERE 
  c.path <@ subpath('0001.0003.0002.0002.0005', 0, -1) AND
  c.path <> subpath('0001.0003.0002.0002.0005', 0, -1);
...
Рейтинг: 0 / 0
Есть ли что-то похожаее на hierarchyid?
    #38957145
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОКТОГЕН
Код: sql
1.
2.
SELECT user_id, path FROM comments
 WHERE path <@ subpath('0001.0003.0002.0002.0005', 0, -1);



ааа! спасибо
Задача решена, но все-таки вопрос остается чисто принципиально:
как сделать то, что выша спросил? то есть использовать запрос с подзапросом, где формируется path?
Почему у меня ошибка в запросе, когда пытаюсь склепать путь из двух частей?
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Есть ли что-то похожаее на hierarchyid?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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