¿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 nivel) en una base de datos?
He hecho esto una vez antes de usar una tabla con una clave foránea para sí mismo.
¿Qué otras implementaciones podrías ver, y tiene sentido esta implementación?
sql
database-design
tree
CodeMonkey1313
fuente
fuente
Respuestas:
Menciona el más comúnmente implementado, 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, que incluyen rutas materializadas y 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 anterior).
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".
Los principales puntos 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 ID 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 de la organización por separado de los propios empleados y mantener al empleado como un atributo de la estructura. De esta manera, cuando un empleado deja la empresa, la estructura organizativa en sí misma no necesita ser cambios, solo la asociación con el empleado que se fue.
2) ¿El árbol es pesado para escribir o pesado? Algunas estructuras funcionan muy bien cuando se lee la estructura, pero incurren en gastos generales adicionales al escribir en la estructura.
3) ¿Qué tipo 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 número de nodos secundarios que cumplen ciertas condiciones, etc. Debe saber qué información se necesitará de la estructura para determinar la estructura que mejor se ajuste tus necesidades.
fuente
Eche un vistazo a Gestión de datos jerárquicos en MySQL . Discute dos enfoques para almacenar y administrar datos jerárquicos (en forma de árbol) en una base de datos relacional.
El primer enfoque es el modelo de lista de adyacencia, que es lo que esencialmente describe: tener una clave externa que se refiere a la tabla misma. Si bien este enfoque es simple, puede ser muy ineficiente para ciertas consultas, como construir 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 explicaciones detalladas y consultas de ejemplo.
fuente
Si tiene que usar la base de datos relacional para organizar la estructura de datos de árbol, Postgresql tiene un módulo ltree genial que proporciona el 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 utiliza para organizar registros en estructura jerárquica.
fuente
Tener una mesa con una clave foránea para sí tiene sentido para mí.
A continuación, puede usar una expresión de tabla común en SQL o la instrucción connect by before en Oracle para construir su árbol.
fuente
Fantástica colección de funciones listas para usar que se pueden usar con el modelo de lista de adyacencia para simplificar la vida.
http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html
fuente
He usado la siguiente implementación en SQL SERVER 2005. Marque aquí
fuente
Si alguien que usa MS SQL Server 2008 y versiones posteriores tiene esta pregunta: SQL Server 2008 y versiones posteriores tienen una nueva característica "jerarquíaId" diseñada específicamente para esta tarea.
Más información en https://docs.microsoft.com/en-us/sql/relational-databases/hierarchical-data-sql-server
fuente