2009-02-25 15 views
7

Tengo curiosidad por saber cuál es la mejor forma (mejores prácticas) para manejar las jerarquías en lo que respecta al diseño de la base de datos. Aquí hay un pequeño ejemplo de cómo generalmente los manejo.Manejo de datos de jerarquía en la base de datos

tabla de nodos

NodeId int PRIMARY KEY 
NodeParentId int NULL 
DisplaySeq int NOT NULL 
Title nvarchar(255) 

antepasado Tabla

NodeId int 
AncestorId int 
Hops int 

con Índices en NODEID, AncestorId, lúpulo

Tablas tener este aspecto:

Nodo Tabla

NodeId NodeParentId DisplaySeq Title 
1   NULL   1    'Root' 
2   1    1    'Child 1' 
3   1    2    'Child 2' 
4   2    1    'Grandchild 1' 
5   2    2    'Grandchild 2' 

antepasado Tabla

NodeId AncestorId Hops 
1   NULL   0 
1   1    0 
2   1    1 
2   2    0 
3   1    1 
3   3    0 
4   1    2 
4   2    1 
4   4    0 
5   1    2 
5   2    1 
5   5    0 

Con este diseño, me he dado cuenta que con grandes jerarquías puedo conseguir una sección entera de la jerarquía muy rápidamente al unirse en el Tabla de antepasados ​​para AncestorId = target NodeId, como:

SELECT * 
FROM Node n 
INNER JOIN Ancestor a on a.NodeId=n.NodeId 
WHERE a.AncestorId = @TargetNodeId 

También es e asy para obtener hijos directos también

SELECT * 
FROM Node n 
INNER JOIN Ancestor a on a.NodeId=n.NodeId 
WHERE a.AncestorId = @TargetNodeId 
AND Hops = 1 

Me interesa saber qué otras soluciones puede haber utilizado para este tipo de cosas. En mi experiencia, las jerarquías pueden ser bastante peludas, y cualquier forma de optimizar su recuperación es muy importante.

Respuesta

4

Como MarkusQ y n8wrl ya se han señalado, Joe Celko tiene algunas cosas buenas en esto.Añadiré que hay múltiples formas de modelar una jerarquía (el libro de Joe contiene varios, creo, y no solo uno que él considere el "mejor"). Su decisión final con suerte tendrá en cuenta sus propias necesidades específicas. Algunas de las diferentes maneras de modelarlo son mejores para operaciones de escritura intensiva mientras que otras son mejores para lecturas frecuentes o rápidas hacia arriba y hacia abajo de la jerarquía. Solo tenga en cuenta lo que su sistema hará con él.

10

Hay algunas extensiones específicas del proveedor de hacer esto, pero mi forma favorita db-neutro proviene de Joe Celko - Google 'Joe Celko árboles y jerarquías' o comprar de este libro: link text

Este es un muy inteligente un camino basado en el set para ir. Jerarquía fácil de consultar. Agregué el campo 'parentID' que tiene porque hago muchas preguntas a los 'niños directos' y 'padres' y eso los acelera. Pero esta es una forma maravillosa de obtener una consulta de 'ancestry' o 'descdent'.

6

También es posible que desee comprobar hacia fuera el "conjuntos anidados" patrón:

http://www.intelligententerprise.com/001020/celko.jhtml (enlace roto)

O usted puede buscar en Google para obtener más.

P.S .: Curses, n8wrl, ¡escribe más rápido que yo!

+0

conjuntos anidados! ¡Ese es el término que estaba buscando! – n8wrl

+0

Artículo bastante interesante. El único problema que siempre he tenido es que al agregar/eliminar un nodo, debes actualizar la posición de cada otro nodo después de él. –

+0

Lo haces. Y ahí es donde la respuesta de Tom H es tan importante. Para mí, esto funciona maravillosamente en las jerarquías. Tengo ese cambio con bastante poca frecuencia. – n8wrl

1

En Oracle, puede usar CONNECT BY/START WITH para consultar datos jerárquicos. En SQL Server, puede usar un procedimiento almacenado, que se llama recursivamente.

+0

He utilizado las llamadas recursivas pero la consulta se ejecuta muy lentamente, por lo que implementé la tabla Ancestro, así que pude alejarme de una llamada recursiva. –

Cuestiones relacionadas