2009-12-16 6 views
11

Я новичок в SQL Server 2008 и только что познакомился с HierarchyId's.Некоторые вопросы о HierarchyId (SQL Server 2008)

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

Мои вопросы

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

ответ

-3

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

Рэнди

+6

Я предполагаю, что вы имеете в виду рекурсивной КТР, а КТР вообще не имеют ничего общего с иерархией. Даже тогда эти два понятия не являются взаимоисключающими, и иерархия имеет гораздо лучшую производительность, чем любой другой метод, который я видел (при индексировании и использовании правильно). Столбец иерархии также может быть объединен с другими столбцами типа вложенного набора для выполнения очень сложных иерархических запросов с показателем индекса. Я бы сказал, что ваша критика необоснованна; Иерархия является на самом деле одним из самых недоиспользуемых типов данных в SQL 2008. – Aaronaught

+2

Это не только недостаточно, но и поддерживается. Не поддерживается поддержка HierarchyId в LinqtoSQL или Entity Framework (разработчик dbml просто не тронет их). Это справедливо даже в VS 2010 RC. –

+2

Для некоторых из нас HierarchyId является очень необходимым дополнением к SQL. Это устраняет необходимость во многих рекурсивных запросах и может приносить правильную прибыль при значительном повышении производительности. – Mark

11

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

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

Создать таблицу с 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

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

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

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

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

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

Смежные вопросы