2010-04-07 21 views
10

Tengo una tabla MySQL que representa los datos de un componente GUI árbol, aquí está la estructura de mi mesa:¿Cómo seleccionar todos los padres de un nodo en una tabla jerárquica mysql?

treeTable ( 
    id INT NOT NULL PRIMARY KEY, 
    parentId INT, 
    name VARCHAR(255) 
); 

parentId es una clave externa de autorreferencia.

Ahora quiero escribir un procedimiento almacenado que obtiene un ID de nodo y devuelve un conjunto de resultados que contiene ese nodo y todos sus elementos principales.

Por ejemplo, supongamos que mi mesa ha llenado con estos datos:

1, null, 'root' 
2, 1 , 'level_1' 
3, 2 , 'level_2' 

Ahora quiero conseguir todos los nodos padre de nodo 3 (nodos 1 y 2) y devuelve un conjunto de resultados que contiene todos los árboles archivos. puede alguien ayudarme por favor?

+0

mirada a este tema: [jerárquico-datos-en-mysql] [1] [1]: http://stackoverflow.com/questions/1085287/hierarchical-data-in- mysql –

Respuesta

2

Buena pregunta. En Oracle usaría algo como CONNECT BY.

Dado que está utilizando MySQL, le sugiero que modifique su estructura de datos para responder de manera eficiente a esa consulta. Here son algunas ideas.

1

There was a similar discussion a esto que podría ser útil para resolver este problema.

Creo que podría atacar este problema recursivamente recuperando los datos hasta que llegue al nodo raíz (el padre era nulo). Pude haber estado inclinado a hacer esto fuera del procedimiento almacenado inicialmente (llamando repetidamente a la cosa hasta que la fila recuperada tuviera el padre nulo), pero la solución de "tabla de cierre" en la página a la que hice referencia aquí parece una gran solución.

1

También hay materialized paths para pensar. Concepto bastante simple que es realmente agnóstico de base de datos. Es mucho más fácil de administrar inserciones, etc., a diferencia de los conjuntos anidados, no es necesario que sepa que está en los nodos izquierdo/derecho, etc. antes de insertar.

1

MySQL no es compatible con las funciones con valores de tabla 18.2.1. Stored Routine Syntax (que es lo que necesita para poder devolver un conjunto de resultados arbitrario).

Sin ellos tiene tres opciones:

  1. desenrollar la consulta del árbol a una profundidad máxima fija y limitar la anidación permitida en la jerarquía,
  2. utilizar un bucle para escribir los datos en una tabla temporal y introducir alguna convención para devolver los resultados a la persona que llama. Deberá considerar la reincorporación o
  3. precalcular los resultados incluyendo todos los antepasados ​​de cada componente en una tabla de soporte (como se muestra) y mantenerlos con activadores en treeTable. De esta forma, el procedimiento almacenado devuelve las filas en parentTable filtradas apropiadamente. Tendrá que crear una clave primaria compuesta y posiblemente índices para un acceso eficiente.

La tercera opción tiene filas muy pequeñas, dará un buen rendimiento y evitará limitaciones artificiales.

parentTable (
    id INT NOT NULL, 
    parentId INT NOT NULL 
); 

La sugerencia de utilizar un enfoque de conjunto anidado puede ser adecuada en esta aplicación donde los datos son en gran parte estáticos. Un conjunto de datos que cambia rápidamente podría comenzar a afectar el rendimiento de E/S ya que, en promedio, la mitad de las filas de la tabla se actualizan para cada inserción o eliminación.

Cuestiones relacionadas