type query organigrama jerarquica data consulta binarios arboles sql sql-server tsql hierarchical-data

query - sql hierarchy data type



Cómo almacenar un árbol en la base de datos SQL (6)

Encontré que la discusión en los Anti-patrones SQL fue muy útil, ya que también se enfoca en los inconvenientes de cada implementación.

Además, las diapositivas 48-77 en esta presentación reiteran ese análisis.

En pocas palabras, no existe un árbol genérico ni una bala de plata para los árboles SQL. Tendrá que preguntarse sobre los datos, cómo y cuánto se seleccionarán, modificarán, se moverán las sucursales, etc., y en base a esas respuestas, implemente una solución adecuada.

Tengo que almacenar un árbol en una base de datos, ¿cuál es la mejor manera de hacer esto? Muestra el método que usas y nombra sus pros y sus contras. (Estoy usando SQL Server 2005)


Hay dos enfoques generales

  1. En cada registro, Almacene el ID del padre en una columna que pueda contener nulos (la raíz del árbol no tiene padre)
  2. Utilice la técnica del modelo de conjunto anidado de Joe Celko que se explica here y (gracias al comentario de @onedaywhen), también en la fuente original here

EDITAR: nuevo enlace para este material está here .

Pros y contras ?? !! Estás bromeando, verdad ?!


He hecho esto en el pasado almacenando datos como xml en SQL.




Bueno, la forma más fácil sería que un registro tenga una columna ParentID para que sepa qué registro es su padre. Esta es una práctica bastante estándar. Por ejemplo, una tienda en línea puede tener una jerarquía de categorías de productos. Cada categoría tendrá un ParentID. Ejemplo: la categoría "Pantalones vaqueros" en una base de datos de ropa podría tener "Pantalones" como categoría principal. Es un poco más difícil si desea que un registro indique cuáles son sus hijos, a menos que restrinja el número de niños. Si desea un árbol binario, podría tener las columnas LeftChildID y RightChildID. Si permite cualquier cantidad de hijos, podría tener una columna Hijos con identificaciones delimitadas por comas (como 1,4,72,19 ), pero eso dificultará las consultas. Si su base de datos permite tipos de matriz en columnas, probablemente pueda usar una matriz en lugar de una cadena delimitada, lo que sería fácil de consultar, pero no estoy seguro de que MS SQL Server lo admita o no.

Aparte de eso, depende de qué tipo de datos esté modelando y también qué tipo de operaciones planea hacer con este árbol.