Cómo representar una estructura tipo árbol en una bd


Estoy comenzando un proyecto y estoy en la fase de diseño: Es decir, aún no he decidido qué marco de base de datos voy a usar. Voy a tener un código que crea una estructura tipo "bosque". Es decir, muchos árboles, donde cada árbol es un estándar: nodos y bordes. Después de que el código crea estos árboles, quiero guardarlos en la base de datos. (y luego sacarlos eventualmente)

El enfoque ingenuo para representar los datos en la bd es una bd relacional con dos tablas: nodos y aristas. Es decir, el la tabla de nodos tendrá un id de nodo, datos de nodo, etc.. Y la tabla bordes será una asignación de id de nodo a id de nodo.

¿Hay un enfoque mejor? ¿O dadas las suposiciones (limitadas) que estoy dando, este es el mejor enfoque? ¿Qué tal si añadimos la suposición de que los árboles son relativamente pequeños - es mejor guardar todo el árbol como una gota en la base de datos? ¿Qué tipo de db debo usar en ese caso? Por favor, comente sobre la velocidad / escalabilidad.

Gracias

Author: Bill Karwin, 2011-07-04

2 answers

Mostré una solución similar a sus tablas de nodos y bordes, en mi respuesta a la pregunta de StackOverflow: ¿Cuál es la forma más eficiente/elegante de analizar una tabla plana en un árbol? Llamo a esta solución "Tabla de cierre".

Hice una presentación sobre diferentes métodos de almacenamiento y uso de árboles en SQL, Modelos para Datos Jerárquicos con SQL y PHP. Demostré que con los índices correctos (dependiendo de las consultas que necesita ejecutar), el diseño de la tabla de cierre puede tener muy buen rendimiento, incluso en grandes colecciones de bordes (alrededor de 500K bordes en mi demo).

También cubrí el diseño en mi libro, SQL Antipatterns: Avoiding the Pitfalls of Database Programming.

 17
Author: Bill Karwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:04

Asegúrese de usar algún tipo de codificación de bajo nivel para la entidad que está siendo treed para evitar el bucle. La entidad puede ser una parte, asunto, carpeta, etc.

Con un archivo de Entidad y un archivo de Entidad-Xref puede recorrer una de las dos relaciones entre los dos archivos, una relación padre y una relación hijo.

Un nivel es el nivel que una entidad encuentra en un árbol. Un código de bajo nivel para la entidad es el nivel más bajo que una entidad se encuentra en cualquier árbol en cualquier lugar. Compruebe para asegurarse de que el código de bajo nivel de la entidad que desea hacer un hijo es menor o igual para evitar un bucle. después de agregar una entidad como hija, se convertirá al menos en un nivel inferior.

 1
Author: eric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-01 19:54:20