D
Digital Q.DataBase 🎙
@dqdatabase602 подп.
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, продолжат функционировать в штатном режиме.
259
просмотров
3394
символов
Да
эмодзи
Нет
медиа

Другие посты @dqdatabase

Все посты канала →
Дорогие подписчики! 🟣 Продолжаем серию публикаций о новых ф — @dqdatabase | PostSniper