tipos grado estructura datos clasificacion binarios binario arboles arbol altura sql database-design tree

sql - estructura - grado de un arbol



Estructura de la base de datos para estructura de datos de árbol (6)

Eche un vistazo a Gestión de datos jerárquicos en MySQL . Discute dos enfoques para almacenar y administrar datos jerárquicos (tipo árbol) en una base de datos relacional.

El primer enfoque es el modelo de lista de adyacencia, que es lo que esencialmente describes: tener una clave externa que se refiere a la tabla en sí misma. Si bien este enfoque es simple, puede ser muy ineficiente para ciertas consultas, como la construcción de todo el árbol.

El segundo enfoque discutido en el artículo es el modelo de conjunto anidado. Este enfoque es mucho más eficiente y flexible. Consulte el artículo para obtener una explicación detallada y consultas de ejemplo.

¿Cuál sería la mejor manera de implementar una estructura de datos de árbol personalizable (es decir, una estructura de árbol con un número desconocido de árboles) en una base de datos?

He hecho esto una vez antes de usar una tabla con una clave externa para sí mismo.

¿Qué otras implementaciones podrías ver y esta implementación tiene sentido?



He utilizado la siguiente implementación en SQL Server 2005. Consulte here


Menciona la más comúnmente implementada, que es la Lista de adyacencia: https://blogs.msdn.microsoft.com/mvpawardprogram/2012/06/25/hierarchies-convert-adjacency-list-to-nested-sets

También hay otros modelos, incluida la ruta materializada y los conjuntos anidados: http://communities.bmc.com/communities/docs/DOC-9902

Joe Celko ha escrito un libro sobre este tema, que es una buena referencia desde una perspectiva general de SQL (se menciona en el enlace del artículo conjunto anidado más arriba).

Además, Itzik Ben-Gann tiene una buena visión general de las opciones más comunes en su libro "Inside Microsoft SQL Server 2005: T-SQL Querying".

Las principales cosas a considerar al elegir un modelo son:

1) Frecuencia de cambio de estructura: con qué frecuencia cambia la estructura real del árbol. Algunos modelos proporcionan mejores características de actualización de estructura. Sin embargo, es importante separar los cambios de estructura de otros cambios de datos. Por ejemplo, es posible que desee modelar el organigrama de una empresa. Algunas personas modelarán esto como una lista de adyacencia, utilizando la identificación del empleado para vincular a un empleado con su supervisor. Este suele ser un enfoque subóptimo. Un enfoque que a menudo funciona mejor es modelar la estructura organizativa por separado de los propios empleados, y mantener al empleado como un atributo de la estructura. De esta forma, cuando un empleado abandona la empresa, la estructura organizativa en sí misma no necesita cambios, solo la asociación con el empleado que se fue.

2) ¿Es el árbol pesado o pesado para leer? Algunas estructuras funcionan muy bien al leer la estructura, pero incurren en gastos adicionales al escribir en la estructura.

3) ¿Qué tipos de información necesita obtener de la estructura? Algunas estructuras se destacan por proporcionar ciertos tipos de información sobre la estructura. Los ejemplos incluyen encontrar un nodo y todos sus elementos secundarios, encontrar un nodo y todos sus padres, encontrar el recuento de nodos secundarios que cumplan ciertas condiciones, etc. Necesita saber qué información se necesitará de la estructura para determinar la estructura que mejor se adapte tus necesidades.


Si tiene que usar Relational DataBase para organizar la estructura de datos en árbol, Postgresql tiene un cool ltree module que proporciona un tipo de datos para representar etiquetas de datos almacenados en una estructura jerárquica similar a un árbol. Puede obtener la idea desde allí. (Para obtener más información, consulte: http://www.postgresql.org/docs/9.0/static/ltree.html )

En común, LDAP se usa para organizar registros en una estructura jerárquica.


Tener una mesa con una clave externa para sí mismo tiene sentido para mí.

A continuación, puede usar una expresión de tabla común en SQL o la conexión por declaración anterior en Oracle para construir su árbol.