Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Какой тип данных выбрать для хранения дерева parent_id или hierarchyid  [new]
Sniffka
Member

Откуда:
Сообщений: 9
Имеется дерево подразделений примерно из 3500 узлов. Вложеность примерно 5-7 уровней. Имеется постоянная потребность искать инфу о списке родителей узлов. Дерево довольно активно трансформируется: добавляются узлы, старые узлы меняют свое содержимое. Конечный потребитель на фронте получает данные в виде JSON, где child отсортированны по алфавиту.
Стал вопрос в каком виде это счастье хранить. Есть 2 подхода:
1. parent_id. Попытка построить дерево на стороне SQL ничего хорошего не дала. Рекурсия на стороне SQL работает долго. Ок. 2 секунд. В итоге отдаю дерево в виде отсортированного по глубине списка. Само дерево строится на фронте. Запрос работает быстро. Доделка дерева на фронте ок. 0.016 сек. Т.е. довольно живенько
2. hierarchyid. Зверь незнакомый. Но имеющий, судя по всему много плюсов. Во всяком случае, поиск родителей работает проще. Но один момент меня смутил. Как вставлять узлы. Для вставки необходимо знать номера узлов-соседей и вычислять номер в иерархии для нового узла.
Первый вариант меня вполне устраивает, но грызут сомнение, что я упускаю шанс упростить работу с данными. Что вы можете порекомендовать в моем случае? Стоит ли связываться с hierarchyid?
10 фев 20, 16:11    [22076917]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных выбрать для хранения дерева parent_id или hierarchyid  [new]
msLex
Member

Откуда:
Сообщений: 7620
Sniffka
Имеется постоянная потребность искать инфу о списке родителей узлов

Sniffka
2. hierarchyid.

Поиск родителей через hierarchyid - это полный скан таблицы, что не быстро. hierarchyid удобен для поиска дочерних записей в дереве.


Хотя для вашего объема 3500 записей, может, и скорости при сканирования будет приемлема.
10 фев 20, 17:29    [22076993]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных выбрать для хранения дерева parent_id или hierarchyid  [new]
Sniffka
Member

Откуда:
Сообщений: 9
Поиск происходит как раз от чилда к родителю.
А не подскажете решение моего вопроса касающегося вставки узла? Или ссылочку на него. Ведь, если я правильно понимаю, дерево мне надо хранить отсортированным. И если я буду вставлять узел, то вставлять в хвост цепочки -- не вариант. Надо втюхивать как внутренний элемент цепи. И тут надо вводить дробные индексы. Типа так:
1, 2, 3, [3.5], 4
Еще вставочка:
1, 2, 3, [3.25], 3.5, 4
Еще вставочка:
1, 2, 3, [3.15], 3.25, 3.5, 4
И т.д.
Я правильно понимаю?
10 фев 20, 18:06    [22077050]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных выбрать для хранения дерева parent_id или hierarchyid  [new]
msLex
Member

Откуда:
Сообщений: 7620
Sniffka
Поиск происходит как раз от чилда к родителю.

Этот как раз самый плохой вариант для hierarchyid



Sniffka
А не подскажете решение моего вопроса касающегося вставки узла?


https://docs.microsoft.com/ru-ru/sql/relational-databases/tables/lesson-2-creating-and-managing-data-in-a-hierarchical-table?view=sql-server-ver15
10 фев 20, 18:09    [22077057]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных выбрать для хранения дерева parent_id или hierarchyid  [new]
Sniffka
Member

Откуда:
Сообщений: 9
Спасибо за ссылку. Вроде и читал доку, но примера не помню. :о(
А не могли бы вы обосновать почему hierarchyid и чем?
И кроме того, можно ли при его помощи быстро построить JSON на стороне SQL, или все-же придется возвращать отсортированный по глубине и именам лист, чтобы собирать его на фронте?
10 фев 20, 18:16    [22077064]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных выбрать для хранения дерева parent_id или hierarchyid  [new]
msLex
Member

Откуда:
Сообщений: 7620
Sniffka
И кроме того, можно ли при его помощи быстро построить JSON на стороне SQL


https://docs.microsoft.com/ru-ru/sql/relational-databases/json/format-query-results-as-json-with-for-json-sql-server?view=sql-server-ver15
10 фев 20, 18:23    [22077069]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных выбрать для хранения дерева parent_id или hierarchyid  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7332
Количество уровней ограничено, следовательно можно использовать GetAncestor(n), где n от 1 до 9 через UNION ALL. И кластерный индекс создать по HID. Будет работать очень быстро.

Сообщение было отредактировано: 10 фев 20, 18:39
10 фев 20, 18:39    [22077084]     Ответить | Цитировать Сообщить модератору
 Re: Какой тип данных выбрать для хранения дерева parent_id или hierarchyid  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3415
msLex
Sniffka
Имеется постоянная потребность искать инфу о списке родителей узлов

Sniffka
2. hierarchyid.

Поиск родителей через hierarchyid - это полный скан таблицы, что не быстро. hierarchyid удобен для поиска дочерних записей в дереве.


Хотя для вашего объема 3500 записей, может, и скорости при сканирования будет приемлема.


интересно... но есть же хиерархический индекс, по нему родители ищутся быстро
12 фев 20, 11:52    [22078108]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить