¿Cómo almacenar el directorio / jerarquía / estructura de árbol en la base de datos?

¿Cómo almaceno una estructura de directorio / jerarquía / árbol en la base de datos? Es decir, servidor MSSQL.

@olavk: No parece que hayas visto mi propia respuesta. La forma en que uso es mucho mejor que las consultas recursivas 🙂

pps ¡ Este es el camino a seguir!

Hay muchas formas de almacenar jerarquías en bases de datos SQL. Cuál elegir depende del producto DBMS que use y cómo se usarán los datos. Como usaste la etiqueta MSSQL2005, creo que deberías empezar a considerar el modelo de “Lista de adyacencia”; Si encuentra que no funciona bien para su aplicación, eche un vistazo a la comparación de Vadim Tropashko que destaca las diferencias entre los modelos con un enfoque en múltiples características de rendimiento.

Si usa Sql Server 2008 es una opción: tal vez debería consultar el nuevo tipo de datos hierarchyid .

Esto es más un marcador para mí que una pregunta, pero también podría ser útil. He utilizado el enfoque de este artículo para almacenar una estructura de directorio / árbol en la base de datos.

También hay algunos fragmentos de código útiles en el artículo.

Espero que esto ayude.

No estoy afiliado a ese sitio web de ninguna manera

También existe el Modelo de Conjunto Anidado de Árboles que tiene algunas ventajas sobre el modelo ParentID. Ver http://www.evanpetersen.com/item/nested-sets.html y http://falsinsoft.blogspot.nl/2013/01/tree-in-sql-database-nested-set-model.html

¿Estás usando SQL Server 2005? Las consultas recursivas hacen que consultar datos jerárquicos sea mucho más elegante.

Editar: Creo que los caminos materializados son un poco hack. La ruta contiene datos redundantes no normalizados, y tiene que usar activadores o algo para mantenerlos actualizados. P.ej. si un nodo cambia de padre, todo el subárbol debe tener sus rutas actualizadas. Y las consultas de subárboles tienen que usar algunas coincidencias de subcadenas feas en lugar de una unión elegante y rápida.

Enfrenté el problema similar con uno de mis proyectos. Tuvimos una gran jerarquía que seguirá aumentando para siempre. Necesitaba atravesarlo rápido y luego encontrar el grupo correcto después de algunas validaciones complejas. En lugar de ir a SQL Server y preguntarme cómo puedo hacerlo de manera eficiente allí cuando sabía que las consultas recursivas son la única solución viable. Pero, ¿realmente sabe si hay alguna optimización posible en Consultas recursivas? ¿Hay alguna garantía de que su jerarquía no aumente en el futuro y un buen día descubre que sus consultas recursivas son demasiado lentas para ser utilizadas en producción?

Entonces, decidí darle una oportunidad a Neo4J. Es una base de datos de gráficos con muchos algoritmos útiles incorporados, un recorrido increíblemente rápido con documentación decente y ejemplos. Almacene la jerarquía en Neo4J y acceda a la jerarquía utilizando un Servicio de Ahorro (u otra cosa). Sí, tendrá que escribir un código que integrará sus consultas SQL con Neo4J pero tendrá una solución escalable y más a prueba de futuro.

Espero que encuentres esto útil.

La pregunta es similar a esta pregunta que se cerró. Encontré respuestas a ambas preguntas muy útiles en mis búsquedas, y finalmente me llevaron al manual de MongoDB que presenta 5 formas diferentes de modelar estructuras de árbol: https://docs.mongodb.com/manual/applications/data-models-tree -estructuras /

Si bien MongoDB no es una base de datos relacional, los modelos presentados son aplicables a las bases de datos relacionales, así como a otros formatos como JSON. Es evidente que debe averiguar qué modelo es el correcto en función de los pros / contra presentados.

El autor de esta pregunta encontró una solución que combinaba los modelos Parent y Materialized Paths. Mantener la profundidad y el padre podría presentar algunos problemas (lógica extra, rendimiento), pero claramente hay ventajas para ciertas necesidades. Para mi proyecto, las rutas materializadas funcionarán mejor y superé algunos problemas (clasificación y longitud de la ruta) mediante técnicas de este artículo.

La forma típica es una tabla con una clave externa (por ejemplo, “ParentId”) en sí misma.