Некоторые вопросы о HierarchyId (SQL Server 2008)

Я новичок в SQL Server 2008 и только что познакомился с HierarchyId's.

Я изучаю SQL Server 2008 - HIERARCHYID - ЧАСТЬ I. Поэтому в основном я следую статье за ​​строкой, и, практикуя в SSMS, я обнаружил, что для каждого ChildId генерируются шестнадцатеричные значения как 0x, 0x58,0x5AC0 и т.д.

Мои вопросы

  • Что представляют собой эти шестнадцатеричные значения?
  • Почему они генерируются и каковы их использование? Я имею в виду, где я могу использовать эти значения гекса?
  • Есть ли у нас контроль над этими значениями гекса? Я имею в виду, можем ли мы обновить и т.д.
  • Как определить иерархию, просмотрев эти значения hexa. Я имею в виду, как определить, кто является родительским и является дочерним?

Ответ 1

Эти шестнадцатеричные значения являются просто двоичным представлением уровня иерархии. В общем, вы не должны использовать их напрямую.

Вы можете проверить следующий пример, который, я думаю, должен быть понятным. Надеюсь, он заставит вас идти в правильном направлении.

Создать таблицу с полем hierarchyid:

CREATE TABLE groups (
    group_name       nvarchar(100)  NOT NULL,
    group_hierarchy  hierarchyid    NOT NULL
);

Вставить некоторые значения:

INSERT INTO groups (group_name, group_hierarchy)
VALUES
    ('root',     hierarchyid::Parse('/')),
    ('domain-a', hierarchyid::Parse('/1/')),
    ('domain-b', hierarchyid::Parse('/2/')),
    ('sub-a-1',  hierarchyid::Parse('/1/1/')),
    ('sub-a-2',  hierarchyid::Parse('/1/2/'));

Запрос таблицы:

SELECT 
    group_name,
    group_hierarchy.ToString()
FROM
    groups
WHERE
    (group_hierarchy.IsDescendantOf(hierarchyid::Parse('/1/')) = 1);

Ответ 2

Адам Милаццо написал замечательную статью о внутренностях иерархии здесь:

http://www.adammil.net/blog/view.php?id=100

Вкратце, не имеет смысла работать с вещами в прямом шестнадцатеричном формате, а скорее преобразовывать числа в двоичные. Причина в том, что вещи не режутся даже на границах байтов. Представление единственного node может быть коротким, как 5 бит, если это один из первых четырех узлов. Становится все длиннее и длиннее по мере использования большего количества узлов, по 6 бит для следующих 4 узлов, по 7 бит для следующих 8 узлов, а затем он перескакивает до 12 бит каждый для следующих 64 узлов! А затем до 18 бит каждый для следующих 1024.

Мне нужно было преобразовать базу данных в Postgres и написать script, который анализирует эти шестнадцатеричные значения. Вы можете проверить версию, которую я сделал для AdventureWorks здесь, найти "hierarchyid":

https://github.com/lorint/AdventureWorks-for-Postgres/blob/master/install.sql

Ответ 3

Я позволю другим адресовать ваши конкретные вопросы, но я скажу вам, что IMO, HierarchyId в SQL Server 2008 не является одним из самых больших вкладов Microsoft в SQL Server. Они сложны и несколько неудобны. Я думаю, вы обнаружите, что для многих иерархических потребностей обычные табличные выражения (CTE) отлично работают.

Ренди