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.
conjuntos anidados! ¡Ese es el término que estaba buscando! – n8wrl
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. –
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