powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Деревья в PG
15 сообщений из 15, страница 1 из 1
Деревья в PG
    #39882036
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так и не нашел однозначного ответа как лучше сделать древовидную структуру по времени выполнения запросов.
Суть задачи: есть таблица древовидная таблица свойств объектов и таблица объектов, где у объекта может быть несколько свойств.
Древовидная таблица~1000 записей, объектов 1000000 записей.
В финал вышли 2 варианта.
1. Расширение intarray
таблица tree-свойства
Код: sql
1.
2.
3.
id integer
name text
parent_id integer


таблица object
Код: sql
1.
2.
3.
id integer
name text
property integer[]



2. Расширение ltree
таблица tree-свойства
Код: sql
1.
2.
id ltree
name text


таблица object
Код: sql
1.
2.
3.
id integer
name text
property ltree[]



По функционалу мне больше нравится 2-й вариант, пусть даже он и на диске много места занимает, но в первую очередь интересует общая производительность на такой структуре.
...
Рейтинг: 0 / 0
Деревья в PG
    #39882043
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ltree
...
Рейтинг: 0 / 0
Деревья в PG
    #39882051
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TrogloditТак и не нашел однозначного ответа как лучше сделать древовидную структуру по времени выполнения запросов.
Да потому что нет его.

Из распространённых:
- Adjacency List
- Materialized Path
- Nested Sets
- Closure Table
И их гибриды.

У каждой есть сильные и слабые стороны. Серебряной пули здесь нет. Изучите все, выберите ту структуру, для которой ваши задачи подходят лучше и слабые стороны которой для вас менее важны.

parent_id - это Adjacency List
ltree - реализация Materialized Path
...
Рейтинг: 0 / 0
Деревья в PG
    #39882065
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Melkij, спасибо за ответ.
я про приоритет в общем написал выше.
На 1000 чтений будет 1 запись, т.е. основной критерий быстрый поиск при SELECT.
Для меня выбор не очевиден, т.к. древовидные структуры до этого редко использовал (обычно пользовался тем что уже было), поэтому и спрашиваю.
По найденной информации народ хвалит ltree, но практики использования у меня не было, хотя на мой взгляд по идее реализация intarray c рекурсией должна быть быстрее, но вот вопрос а на сколько быстрее, т.е. удобство ltree неоспоримо, при этом если потеря производительности будет, например, в пределах 10%-это того стоит, если кратно уже печально.
...
Рейтинг: 0 / 0
Деревья в PG
    #39882071
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Trogloditя про приоритет в общем написал выше.
Нет, не написали.
Для деревьев важно не только соотношение чтение/запись но и чтение чего именно и запись чего именно. Сравните задачу вычитать ветвь дерева для AL и для MP.
...
Рейтинг: 0 / 0
Деревья в PG
    #39882081
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Melkij,
меня запись не волнует, даже если и будут проблемы их можно решить, при
соотношении 1000 к 1 или 100000 к 1 (чтение/запись).
Есть типовые операции с деревьями на чтение, у меня вряд ли будет новая америка.
Основной вопрос я описал, насколько в среднем на наборе типовых операций на чтение ltree медленнее.
Если цена вопроса 10-30% это не страшно, более 100% уже повод задуматься.
Есть еще вариант держать все в JSON'е и с помощью jsonpath доставать ветви деревьев,но
там чую будет гигантская проблема на запись, и из-за размера данных JSON будет вываливаться в toast.
...
Рейтинг: 0 / 0
Деревья в PG
    #39882092
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Troglodit,

ещё раз: имеет значение не только соотношение чтения к записи но и что именно вы хотите читать. На задаче "прочитать заданную ветвь дерева" AL очевидный аутсайдер. На задаче "получить детей заданного родителя" - AL очевидный фаворит, ведь как раз parent_id у него в явном виде хранится и элементарно извлекается за один index scan. Для ltree возможно с этим может поспособствовать gist, но надо смотреть.
...
Рейтинг: 0 / 0
Деревья в PG
    #39882107
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Melkij,
и еще раз, я с вами не спорю, вы пишете все абсолютно корректно на сравнение одной и той же операции.
Но вы меня не слышите. Я не говорю про конкретную операцию.
Я говорю про среднюю температуру по больнице на НАБОРЕ операций на чтение.
Мне нравится само дополнение ltree, я бы выбрал его, я хочу понять, что я теряю по производительности.
То, что я теряю, на физическом размещении данных+индекса меня не волнует, так же как и накладные расходы
при вставке, изменении значений.
...
Рейтинг: 0 / 0
Деревья в PG
    #39882127
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Troglodit,

Насколько Камаз лучше ferrari? Насколько в среднем по больнице бетон лучше стекла? На 10% или на 15%? Что выбрать, сталь или пластик?
Серебряной пули для древовидных структур в рсубд как я уже писал - нет. Каждый вариант окажется лучше на одних операциях и хуже на других.
Если хотите случайный результат без учёта своих задач - подкиньте монетку.
...
Рейтинг: 0 / 0
Деревья в PG
    #39882145
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Melkij,
Мы с вами зашли в тупик, ваши примеры не корректны.
Я сравниваю два сравнимых в одной категории инструмента, т.е. они оба могут решать все задачи.
В ваших примерах применение разное, что некорректно.
Я не использовал ltree и вопрос был практический, вы увели тему в академическую плоскость, где в общем случае вы правы.
У кого есть практика по ltree сможет сразу однозначно ответить на мой практический вопрос.
...
Рейтинг: 0 / 0
Деревья в PG
    #39882198
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TrogloditMelkij,
Мы с вами зашли в тупик, ваши примеры не корректны.
Я сравниваю два сравнимых в одной категории инструмента, т.е. они оба могут решать все задачи.
В ваших примерах применение разное, что некорректно.
Я не использовал ltree и вопрос был практический, вы увели тему в академическую плоскость, где в общем случае вы правы.
У кого есть практика по ltree сможет сразу однозначно ответить на мой практический вопрос.

Вопрос в контексте "Я не говорю про конкретную операцию." - тоже исключительно академический.
Какие то задачи будет ltree на порядки быстрее решать... какие то задачи integer[] будет быстрее решать тоже на порядки быстрее,
на каких то они будут сравнимые.

Можно легко придумать задачи и на первый случай и на второй случай и на третий случай.

Например задача перенести свойство в другую ветку дерева - в первой модели почти бесплатное... а во второй превращается в полный ад с обновлением всех обьектов (и там разница будет не на 1 порядок а на все 6 легко).

PS: кстати в общем случае intarray расширение для использования integer[] не нужно.

PPS: а какого типа индекс вы хотите использовать на весьма неожиданный для меня тип ltree[] т.е. на массив ltree и каким именно образом? Насколько я понимаю у вас там будут больши сложности с этим.
...
Рейтинг: 0 / 0
Деревья в PG
    #39882234
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TrogloditВ ваших примерах применение разное, что некорректно
Так именно о чём и я пытаюсь сказать.
И камаз и феррари - транспорт. Можно взять для того чтобы человека куда-то отвезти.
Корпус некоторого устройства возможно изготовить из металла или пластика.
(бетон со стеклом наверное перегнул, ладно)
Так на сколько процентов камаз лучше феррари? А если везти не одного человека, а гору песка?

Maxim BogukPPS: а какого типа индекс вы хотите использовать на весьма неожиданный для меня тип ltree[] т.е. на массив ltree и каким именно образом? Насколько я понимаю у вас там будут больши сложности с этим.
gist я так предполагаю, штатный опкласс для ltree[] есть.

TrogloditУ кого есть практика по ltree сможет сразу однозначно ответить на мой практический вопрос.
Не сможет. И уж тем более "однозначно"
Насколько ltree быстрее и компактнее такого же MP собранного на коленке из text - да, замерить можно и в этом смысл будет.
Свести различия между AL и MP к одной цифре - невозможно, это будет бесполезным враньём.
...
Рейтинг: 0 / 0
Деревья в PG
    #39882273
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TrogloditТак и не нашел однозначного ответа как лучше сделать древовидную структуру по времени выполнения запросов.
Суть задачи: есть таблица древовидная таблица свойств объектов и таблица объектов, где у объекта может быть несколько свойств.
Древовидная таблица~1000 записей, объектов 1000000 записей.
В финал вышли 2 варианта.
1. Расширение intarray
таблица tree-свойства
Код: sql
1.
2.
3.
id integer
name text
parent_id integer


таблица object
Код: sql
1.
2.
3.
id integer
name text
property integer[]



т.е. свойства у вас неизмеримые (не имеют велью, но только тип). скорее "теги" ,чем "св-ва"
2. Расширение ltree
таблица tree-свойства
Код: sql
1.
2.
id ltree
name text


таблица object
Код: sql
1.
2.
3.
id integer
name text
property ltree[]



для 1000 тегов вполне допустим лишний хеш-джойн
т.е. структура ~

таблица tree-свойства
Код: sql
1.
2.
3.
id integer PK -- пустой суррогат
lid ltree UNIQUE NOT NULL -- дерево
name text UNIQUE NOT NULL


таблица object
Код: sql
1.
2.
3.
id integer
name text
property integer[]


со снятием вопроса про индексирование массивов лтрии.
...
Рейтинг: 0 / 0
Деревья в PG
    #39882459
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim BogukВопрос в контексте "Я не говорю про конкретную операцию." - тоже исключительно академический.
Какие то задачи будет ltree на порядки быстрее решать... какие то задачи integer[] будет быстрее решать тоже на порядки быстрее,
на каких то они будут сравнимые.

Можно легко придумать задачи и на первый случай и на второй случай и на третий случай.

Например задача перенести свойство в другую ветку дерева - в первой модели почти бесплатное... а во второй превращается в полный ад с обновлением всех обьектов (и там разница будет не на 1 порядок а на все 6 легко).

PS: кстати в общем случае intarray расширение для использования integer[] не нужно.

PPS: а какого типа индекс вы хотите использовать на весьма неожиданный для меня тип ltree[] т.е. на массив ltree и каким именно образом? Насколько я понимаю у вас там будут больши сложности с этим.
Я понимаю, что в частном конкретном запросе результаты будут разные.
Меня пока не интересует производительность связанная с вставкой и обновлением, я писал неоднократно выше.
массив ltree нужен потому как у одного объекта будет привязка к НЕСКОЛЬКИМ веткам дерева, а не одно как по классике.
Другого способа с ltree разместить данные с этими вводными я не знаю.
используя ltree @> ltree[] (из доки) я смогу найти объекты-потомки любого узла.
В доке написано, что @>использует индексы в отличии от ^@>.

про intarray читал, что только с ним работают индексы с операциями над массивами, возможно уже не так, я его года 3-4 назад смотрел, мне понравилось расширение.
...
Рейтинг: 0 / 0
Деревья в PG
    #39882461
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,
да конечно Pk будет суррогатный.
А тэг или что то более серьезное какая разница.
Добавив JSONB-column в таблицу tree можно что угодно разметить.
Я просто упростил.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Деревья в PG
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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