259просмотров
43.0%от подписчиков
17 марта 2026 г.
Score: 285
Дорогие подписчики! 🟣 Продолжаем серию публикаций о новых функциональных возможностях Digital Q.DataBase. Сегодня расскажем о поддержке типа данных hierarchyid, реализованной в нашей СУБД. ✅ Для чего предназначен hierarchyid При проектировании информационных систем часто возникает потребность в хранении и обработке иерархических структур: организационно-штатные расписания, каталоги товаров, классификаторы, технологические карты и т.п. Традиционный подход с использованием рекурсивных связей "внешний ключ на самого себя" работает, однако требует написания громоздких рекурсивных запросов и не всегда обеспечивает приемлемую производительность при работе с глубокими иерархиями. ✅ В MS SQL Server для решения подобных задач был введен тип данных hierarchyid, который позволяет: ➡️Компактно хранить информацию о положении узла в иерархии;
➡️Выполнять навигацию по дереву с помощью встроенных методов;
➡️Эффективно получать поддеревья без использования рекурсивных CTE. ✅ В PostgreSQL существует схожее расширение ltree, однако его семантика и синтаксис отличаются от MS SQL Server. ✅ При разработке Digital Q.DataBase мы выбрали путь максимального сохранения совместимости с существующими приложениями, работающими с T-SQL, поэтому реализовали поддержку hierarchyid в полном соответствии с оригиналом. ⬇️Примеры использования Рассмотрим базовые операции с типом hierarchyid на практических примерах: Сортировка иерархических данных
select cast('/1.2/2/' as hierarchyid) t union
select cast('/1000.500/200/' as hierarchyid) union
select cast('/1.4/-2/' as hierarchyid) union
select cast('/3.1/2/' as hierarchyid)
order by t
GO
Результат сортируется в порядке обхода дерева сверху вниз и слева направо. Определение уровня вложенности
declare @id1 hierarchyid = '/25/33/11/'
select @id1.GetLevel() GO
-- Возвращает 3 Получение предка
DECLARE @id hierarchyid = '/1000.500/200/1/'
select @id.GetAncestor(2).ToString()
GO
-- Возвращает '/1000.500/' Проверка принадлежности поддереву
declare @id1 hierarchyid = '/1/2/3/4/5/6/7/8/', @id2 hierarchyid = '/1/2/3/4/'
select @id1.IsDescendantOf(@id2)
GO
-- Возвращает 1 (истина) Перемещение поддерева
declare @id1 hierarchyid = '/2/2/4/4/', @id2 hierarchyid = '/2/2/4/', @id3 hierarchyid = '/1/'
select @id1.GetReparentedValue(@id2,@id3).ToString()
GO
-- Новый путь: '/1/4/' Вставка нового узла между существующими
declare @id1 hierarchyid = '/2/', @id2 hierarchyid = '/2/4.5.-1/', @id3 hierarchyid = '/2/7/'
select @id1.GetDescendant(@id2, @id3).ToString() GO
-- Генерирует путь, гарантированно расположенный между указанными узлами ✅ Значение для пользователей Digital Q.DataBase Реализация типа данных hierarchyid в Digital Q.DataBase обеспечивает возможность переноса существующих информационных систем, использующих данный механизм, без необходимости изменения прикладного кода и схем данных. Это особенно важно для проектов по импортозамещению, где критически важным является сохранение инвестиций в уже разработанное программное обеспечение. ✅ При переходе на Digital Q.DataBase с MS SQL Server достаточно выполнить перенос баз данных с помощью штатного Мастера переноса — все объекты, использующие тип hierarchyid, продолжат функционировать в штатном режиме.