2008-09-27 17 views
53

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

@olavk: Parece que no has visto mi propia respuesta. La forma en que uso es mucho mejor que las consultas recursivas :)

p.p.s. This is ¡el camino a seguir!

+0

Lo que defiende es el modelo de codificación "ruta materializada". Ese enfoque es fácil de comprender, pero es ineficiente para algunas operaciones, ver http://vadimtropashko.wordpress.com/2008/08/09/one-more-nested-intervals-vs-adjacency-list-comparison/ –

+2

Este es un gran pregunta ... – anbanm

Respuesta

17

Hay many ways para 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 Vadim Tropashko's comparison que destaca las diferencias entre los modelos con un enfoque en múltiples características de rendimiento.

4

Esto es más un marcador para mí que una pregunta, pero también podría serle de ayuda. He utilizado el enfoque this article's 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 con ese sitio web en cualquier forma

3

¿Está utilizando SQL Server 2005? Recursive queries hacen que consultar datos jerárquicos sea mucho más elegante.

Editar: Creo que las rutas materializadas 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.

+0

Hay grandes concesiones a la hora de implementar este tipo de solución. El enfoque recursivo, que solía ser mi favorito, es elegante, pero menos eficiente, ya que las rutas se deben calcular con más frecuencia. – izilotti

1

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

4

También existe el Modelo de conjunto de árboles anidados 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

+0

@Ali - ¡Tu enlace también está roto! – NightOwl888

+0

@ NightOwl888 Sí, se ha roto. Acabo de pasar 20 minutos buscando en Google y no lo encontré ... Así que borré el comentario con el enlace roto. – Ali

+2

He actualizado mi respuesta con algunos enlaces de trabajo –

8

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

+0

+1. ¡Estaba a punto de mencionarlo! –

2

Me enfrenté al 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 me estoy rascando la cabeza, ¿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 le sea útil.

2

La pregunta es similar a this question que se cerró. He encontrado respuestas a las dos preguntas muy útiles en mis actividades, y con el tiempo me llevó al manual MongoDB que presenta 5 maneras diferentes para modelar estructuras de árbol: https://docs.mongodb.com/manual/applications/data-models-tree-structures/

Mientras MongoDB no es una base de datos relacional, los modelos presentados son aplicables a 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ó un solution que combinó los modelos de rutas principales y materializadas. 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 del artículo this.

Cuestiones relacionadas