Некоторые вопросы о HierarchyId (SQL Server 2008) - PullRequest
11 голосов
/ 16 декабря 2009

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

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

Мои вопросы

  1. Что это за шестнадцатеричные значения?
  2. Почему они генерируются и для чего они используются? Я имею в виду, где я могу использовать эти значения гекса?
  3. Имеем ли мы какой-либо контроль над этими значениями гекса? Я имею в виду, мы можем обновить и т. Д.
  4. Как определить иерархию, посмотрев на эти значения гекса ... Я имею в виду, как я могу определить, кто является родителем, а кто дочерним?

Ответы [ 3 ]

11 голосов
/ 18 декабря 2009

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

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

Создать таблицу с полем 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);
0 голосов
/ 29 апреля 2016

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

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

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

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

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

0 голосов
/ 16 декабря 2009

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

Randy

...