2009-03-29 13 views
8

¿Cuáles son las 'mejores prácticas' para guardar patrones compuestos en una base de datos relacional?Almacenamiento de patrones compuestos (datos jerárquicos) en la base de datos

Hemos estado utilizando Modificado Preorden Tree Traversal. Esto es muy rápido para construir todo el árbol, pero muy lento para insertar o eliminar nuevos nodos (todos los valores de la izquierda y la derecha deben ajustarse). También consultar a los hijos de un nodo no es fácil y muy lento.

Otra cosa que notamos es que realmente tienes que asegurarte de que el árbol no se ensucie. Necesita bloqueos de transacciones, de lo contrario, los valores de la izquierda y la derecha se pueden dañar, y corregir un árbol corrupto de la derecha no es una tarea fácil.

Sin embargo, funciona muy bien, el Recorrido de árbol preordenador modificado, pero me preguntaba si hay mejores alternativas.

+0

Ir depende un poco del tipo de consultas que se usan más. –

Respuesta

6

Si bien encontrar todos los descendientes de una fila con MPTT es rápido, encontrar a todos los niños puede ser lento. Sin embargo, debe poder solucionarlo agregando un campo parent_id a su tabla que registre (sí, de forma redundante) el padre de la fila. A continuación, se hará la búsqueda:

SELECT * 
FROM tbl 
WHERE parent_id = z 

Sí, parent_id contiene información redundante, potencialmente desnormalización su mesa - pero ya que cualquier insertar/actualizar/borrar ya requiere cambios globales, manteniendo parent_id hasta a la fecha no es la cantidad adicional pagar. Alternativamente, puede usar un campo level que registre el nivel vertical de la fila, aunque de hecho es más que puede cambiar bajo ciertos tipos de transformaciones (por ejemplo, mover un subárbol a un punto diferente en el árbol).

La representación viejo y simple enlace a padre (es decir, sólo tener parent_id y sin left_pos o right_pos), es por supuesto más rápido para la inserción de las cargas de trabajo/update-pesado, pero las únicas consultas que puede responder de manera eficiente son "Encuentra los padres de X "y" Encuentra los hijos de X. " La mayoría de las cargas de trabajo implican mucho más lectura que escritura, por lo que generalmente MPTT es más rápido en general, pero tal vez en su caso deba considerar mudarse ("volver") a vincular a padres.

0

La mejor manera de almacenar datos hierakiales en una base de datos que he escuchado es usar un atributo de cadena donde el contenido es la lista de padres separados por, digamos, dos puntos.

Cuestiones relacionadas