2011-11-15 24 views
7

Mientras recreaba mi CMS, quería una alternativa al enfoque tradicional padre/hijo para gestionar la jerarquía del mapa del sitio/página. Recordaba haber visto el modelo de conjunto anidado hace un tiempo, pero no recordaba cómo se llamaba. Por lo tanto, me encontré con un enfoque similar que quiero evaluar y comparar las propiedades, asegurándome de que no me toparé con limitaciones estúpidas más adelante porque no fui con lo que ya está probado en el tiempo. Por lo tanto, indique si A) ya se inventó (¿cómo se llama?), B) si hay defectos fundamentales en las propiedades, o C) es un buen enfoque (¡por favor, dé una buena justificación!).Mi alernative a conjuntos anidados para conjuntos de datos jerárquicos de profundidad arbitraria: ¿Bueno o malo?

Considere esta lista:

  • Inicio
    • Sobre Nosotros
    • Contáctenos
    • Productos
      • Ropa
      • Libros
      • Electrónica
    • Knowledge Base
    • Otras cosas

Bajo el modelo de conjunto anidado, creo que almacena los/descriptores de izquierda y derecha para cada nodo con un recorrido en profundidad:

Home     1-18 
    About Us   2-3 
    Contact Us  4-5 
    Products   6-13 
     Clothing  7-8 
     Books   9-10 
     Electronics 11-12 
    Knowledge Base 14-15 
    Other stuff  16-17 

Y aquí está mi "manera incorrecta" de empezar a gustarme mejor:

Home     1-9 
    About Us   2-2 
    Contact Us  3-3 
    Products   4-7 
     Clothing  5-5 
     Books   6-6 
     Electronics 7-7 
    Knowledge Base 8-8 
    Other stuff  9-9 

En lugar de un par de izquierda/derecha, estoy almacenando ID y LAST_CONTAINED_ID. He encontrado que muchas de las propiedades son los mismos (o muy similar):

  • El nodo raíz es ID = 1
  • Por "hojas", ambas propiedades son iguales, mientras que con ramas, no son
  • el número total de "subnodos" para cualquier nodo dado es LAST_CONTAINED_ID - ID
  • Todo contenida nodos tienen un ID> ID del contenedor, pero < = LAST_CONTAINED_ID del contenedor
  • los nodos antepasado tienen un ID < el niño ID , pero también un LAST_CONTAINED_ID> = la identificación del niño
  • La profundidad es la suma del ancestro nodos

Además, el ID sirve un, identificador único de orden específico (sin espacios!). También me resultó más fácil almacenar las referencias DEPTH y PARENT por simplicidad, pero eso es más o menos lo mismo para los juegos anidados según lo que entiendo.

Entonces, ¿esto cuenta como un conjunto anidado? ¿Y ya es un enfoque común (pero por qué no había oído hablar de él antes ...)? ¿Hay una buena razón por la que debería usar un verdadero conjunto anidado sobre esto?

Espero sus comentarios.

+0

Para su información, el modelo de conjunto anidado es una forma de tener una sola tabla en un RDBMS almacenar toda la información necesaria para una jerarquía de una profundidad desconocida (es decir, una lista infinita sin recurrencia): http://en.wikipedia.org/wiki/Nested_set_model#Example – landons

Respuesta

4

La única ventaja que ofrece es la función "sin espacios vacíos", pero para lograrlo, ha tenido que cambiar la lógica aplicada a los valores correctos. En el modelo original, obtienes los hijos de 'Productos' al ver todos esos valores 6 < .. < 13, pero en tu modelo, obtienes esos hijos al ver los valores 4 < .. = 7. Tener que tratar bien- valores diferentes a los valores a la izquierda lo hacen un poco menos elegante.
Otra queja menor es que en el original, el salto de 12 a 14 resalta que ha cambiado de nivel, mientras que en su modelo no obtiene tales indicaciones visuales.
Si está contento de usar (<, < =) en lugar de (<, <), entonces funciona. (Dado que parece ser equivalente, no puedo decir "bueno" o "malo", pero ya ha resaltado los peligros de implementar la ruta menos transitada.)

+2

Creo que tienes razón sobre el salto de 12-14. Creo que es cierto (en los conjuntos anidados habituales), que para cualquier nodo 'n1', si hay un nodo,' n2', con 'n1.right + 1' ==' n2.left', entonces 'n2' es el próximo hermano (y de manera similar para ir a la izquierda), que se pierde en este nuevo modelo. –

+0

¡Esto es exactamente lo que estaba buscando! (Sin embargo, esperaba obtener más comentarios, pero esto es útil.) – landons

+1

He encontrado algunas propiedades más que me gustan, como ajustar los valores de inserción/eliminación en un índice en particular es muy sencillo. La eliminación de una rama realmente moverá a todos los niños un nivel por defecto (que es una buena alternativa a las eliminaciones en cascada para una configuración tradicional de clave externa padre-hijo). Creo que puedo vivir sin la siguiente simplicidad de Sibling(). – landons

Cuestiones relacionadas