2009-09-29 8 views
5

En MySQL, almaceno categorías de esta manera:Generar pan rallado de categorías almacenados en MySQL

categorías: - category_id - category_name - parent_category_id

¿Cuál sería la forma más eficiente para generar la pista/breadcrumb para un category_id determinado?

Por ejemplo pan rallado (category_id): General> Sub 1> Sub 2

podría haber en las teorías niveles ilimitados. Estoy usando php.

ACTUALIZACIÓN: Vimos este artículo (http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/) sobre el conjunto de modelos anidados. Parece interesante, pero ¿cómo lo harías acerca de la gestión dinámica de categorías? Parece más fácil en papel, como cuando conoce de antemano las categorías, pero no cuando el usuario puede crear/eliminar/editar categorías sobre la marcha ... ¿Qué opina?

+1

consultas jerárquicas en MySQL: http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/ –

Respuesta

0

Genere (como quiera) un modelo principal tradicional y almacénelo en caché. Es demasiado caro generarlo sobre la marcha y los cambios en la jerarquía generalmente son varios órdenes de magnitud menos frecuentes que otros cambios. No me molestaría con el modelo de conjuntos anidados, ya que la jerarquía cambiará y luego tendrá que ir a jugar con las izquierdas y los derechos. (Tenga en cuenta que el artículo solo incluía recetas para agregar y eliminar, no para volver a criar, lo cual es muy simple en el modelo principal).

1

Me gusta usar el método Materialized Path, ya que básicamente contiene su ruta de navegación y facilita la tarea de seleccionar todos los descendientes de un nodo sin utilizar consultas recursivas.

modelo Path materializadas

La idea con el modelo de la trayectoria materializada es vincular cada nodo en la jerarquía con su posición en el árbol. Esto se hace con una lista concatenada de todos los antepasados ​​de los nodos. Esta lista generalmente se almacena en una cadena delimitada. Tenga en cuenta el campo "Linage" a continuación. CAT_ID NAME CAT_PARENT Lineage 1 Home . 2 product 1 .1 3 CD’s 2 .1.2 4 LP’s 2 .1.2 5 Artists 1 .1 6 Genre 5 .1. 5 7 R&B 6 .1. 5.6 8 Rock 6 .1. 5.6 9 About Us 1 .1

Atravesando la tabla

Select lpad('-',length(t1.lineage))||t1.name listing 
From category t1, category t2 
Where t1.lineage like t2.lineage ||'%' 
    And t2.name = 'Home'; 
Order by t1.lineage; 

Listado

Home 
-product 
–CD’s 
–LP’s 
-Artists 
–Genre 
—R&B 
—Rock 
-About Us 
+0

El enlace está muerto – lapin

+0

@lapin funciona para mí, el contenido agregado por encima de – RedFilter

0

La belleza de conjuntos anidados es que se puede añadir fácilmente/eliminar nodos del gráfico con sólo unas pocas sentencias SQL simples . Realmente no es tan caro y se puede codificar con bastante rapidez.

Si está utilizando PHP (o incluso si no lo hace), puede consultar este código para ver una implementación bastante directa de adding nodes to a nested set model (archive.org backup). Quitar (o incluso mover) es similarmente sencillo.

+0

El enlace está muerto – lapin

+0

@lapin - Se agregó el enlace archive.org del vínculo inactivo. – timdev

Cuestiones relacionadas