2009-12-16 15 views
11

Soy un novato en SQL Server 2008 y acabo de presentarme a HierarchyId.Algunas preguntas sobre HierarchyId (SQL Server 2008)

Estoy aprendiendo de SQL Server 2008 - HIERARCHYID - PART I. Así que, básicamente, estoy siguiendo la línea de artículo de línea y mientras se practica en SSMS que encontré que por cada childid algunos valores hexadecimales se generan como 0x, etc. 0x58,0x5AC0

Mis preguntas son

  1. qué es esto valores hexadecimales?
  2. ¿Por qué se generan y cuál es su uso? Quiero decir, ¿dónde puedo usar esos valores hexa?
  3. ¿Tenemos algún control sobre esos valores hexa? Quiero decir, ¿podemos actualizar, etc.
  4. Cómo determinar la jerarquía observando esos valores hexa ... Me refiero a cómo puedo determinar cuál es el padre y cuál es el hijo?

Respuesta

-3

Dejaré que otros atiendan sus preguntas específicas, pero les diré que, IMO, el HierarchyId en SQL Server 2008 no es una de las mayores contribuciones de Microsoft a SQL Server. Son complejos y un tanto incómodos. Creo que encontrará que para muchas necesidades jerárquicas, las expresiones comunes de tablas (CTE) funcionan muy bien.

Randy

+6

supongo que te refieres a recursiva CTE, como CTE, en general, no tienen nada que ver con las jerarquías. Incluso entonces, estos dos conceptos no son mutuamente excluyentes y hierarchyid tiene mucho, mucho mejor rendimiento que cualquier otro método que he visto (cuando se indexa y se usa correctamente). Una columna hierarchyid también se puede combinar con otras columnas de tipo anidado para realizar consultas jerárquicas muy complejas con rendimiento de búsqueda de índice. Diría que tu crítica es infundada; hierarchyid es, de hecho, uno de los tipos de datos menos utilizados en SQL 2008. – Aaronaught

+2

No solo no está infrautilizado, sino que también está poco respaldado. No hay soporte para HierarchyId en LinqtoSQL o Entity Framework (el dbml Designer simplemente no los tocará). Esto es cierto incluso en VS 2010 RC. –

+2

Para algunos de nosotros, HierarchyId es una adición muy necesaria a SQL. Elimina la necesidad de muchas consultas recursivas y puede ofrecer ganancias de rendimiento significativas si se usa correctamente. – Mark

11

Esos valores hexadecimales son simplemente una representación binaria del nivel de jerarquía. En general, no debe usarlos directamente.

Es posible que desee comprobar el siguiente ejemplo, que creo que debería ser autoexplicativo. Espero que te ayude en la dirección correcta.

Crear una tabla con un campo hierarchyid:

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

insertar algunos valores:

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/')); 

consultar la tabla:

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

Adam Milazzo escribió un gran artículo sobre las entrañas de hierarchyid aquí:

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

En pocas palabras, no es significativa para trabajar con las cosas en hexagonal recta, sino más bien convertir los números a binario. La razón es que las cosas no están cortadas ni siquiera en los límites de los bytes. La representación de un solo nodo puede ser tan corta como 5 bits si es uno de los primeros cuatro nodos. Se vuelve más y más largo a medida que se usan más nodos, 6 bits cada uno para los siguientes 4 nodos, 7 bits cada uno para los 8 nodos siguientes, y luego salta a 12 bits cada uno para los siguientes 64 nodos. Y luego hasta 18 bits cada uno para el próximo 1024.

Necesitaba convertir una base de datos a Postgres, y escribí un script que analiza estos valores hexadecimales.Se puede extraer de una versión que hice para AdventureWorks aquí, busca "hierarchyid":

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

Cuestiones relacionadas