5

Acabo de aprender cómo implementar el modelo de conjunto anidado pero todavía tengo confusión con cierto aspecto del mismo que involucra elementos que pueden ser parte de múltiples categorías. Teniendo en cuenta el siguiente ejemplo que fue sacado de HERE y refleja muchos otros ejemplos que he encontrado ...Datos jerárquicos - Conjunto anidado Modelo: MySql

Hierarchical Data: Numbered Tree

Table

¿Cómo se evita la duplicación en la base de datos cuando se agrega las manzanas, ya que son multicolor (es decir, rojo, amarillo, verde)?

Respuesta

5

No evite las duplicaciones y la manzana (o una referencia a la manzana) se colocará dos veces en su árbol, de lo contrario no será un árbol sino un gráfico. Su pregunta es igualmente aplicable si crea un ... Swing JTree o un árbol HTML;).

El modelo de conjunto anidado es solo una forma eficiente de empujar y atravesar una estructura de árbol en un DB relacional. No es una estructura de datos en sí misma. Es más popular entre los usuarios de MySQL, ya que MySQL carece de la funcionalidad para procesar estructuras de árbol (por ejemplo, como la que proporciona Oracle).

¡Salud!

+0

Sí, he estado buscando una respuesta pero no encuentro nada definitivo sobre el tema. Estoy utilizando MySQL en este punto, ¿me encontraré con problemas para convertir a una base de datos no libre en el futuro con la duplicación de Apple? ¿O debería tratar de resolver este problema al no permitir el uso de múltiples padres en este punto y simplemente usar el enfoque del Conjunto anidado tal como está? ¿O hay otra forma de abordar este problema utilizando MySQL? – swisscheese

+0

Al menos en el contexto de Oracle no se encontrará con ningún problema. El enfoque del conjunto anidado es bastante portátil porque usa construcciones SQL estándar. En el contexto general, no veo ningún mal con la duplicación de la manzana _reference_. Nunca utilicé los conjuntos anidados en mi práctica, aunque estoy familiarizado con ella. Pero estaría más preocupado por las modificaciones (agregar/eliminar/mover nodos) del árbol. En general son más lentos. También tenga en cuenta que esta no es una técnica estándar y los mantenedores de su solución pueden necesitar un comienzo difícil. –

+0

Gracias por su ayuda con este problema. Si tiene la oportunidad y está dispuesto, ¿puede mirar mi pregunta sobre esto en http://stackoverflow.com/questions/5395463/data-modeling-modeling-categories-subcategories-in-mysql – swisscheese

3

El modelo de conjunto anidado es una estructura para las relaciones 1: N (uno para muchos), desea utilizar la relación M: N (muchos para muchos) (muchos elementos pueden tener apple como primario, pero pueden tener más de uno de los padres).

See this article

Wikipedia

Pero debe tener en cuenta, que jerárquica M: N relaciones pueden llegar a ser muy complejo muy rápido!

+0

Sí Entiendo este concepto pero no lo aplico al modelo de conjunto anidado. Entonces esa es mi pregunta, ¿puede el Modelo de Conjunto Anidado manejar esto y, si es así, cómo? – swisscheese

+0

@swisscheese No puede de ninguna manera realmente simple. Quizás podría tratar de guardar solo las referencias en el árbol (ID de los elementos que apuntan a una tabla diferente que contendría los datos). Pero no creo que el modelo de conjunto anidado sea realmente adecuado para esto. –

3

Pensando en voz alta aquí, pero tal vez sería útil ver algunos atributos (como Rojo, Amarillo y Verde) como 'etiquetas' en lugar de 'categorías' y manejarlos con lógica separada. Eso le permitiría mantener el modelo de Conjunto anidado y evitar la duplicación innecesaria. Además, te permitiría mantener tus categorías más simples.

Todo está en cómo piensas en la información. Las categorías son solo otra forma de representar atributos. Entiendo que su ejemplo fue sólo para fines ilustrativos, pero si va a clasificar la fruta por color, ¿por qué no categorizar la carne de la misma manera, es decir, carne blanca y carne roja? Lo más probable es que no lo harías. Entonces mi punto es que probablemente tampoco sea necesario categorizar la fruta por color.

En su lugar, algunos atributos están mejor representados de otras maneras. De hecho, en su forma más simple, podría registrarse como una columna en la tabla de "alimentos" etiquetada como "color". O bien, si se trata de un atributo muy común y se encuentra duplicando significativamente el valor, podría dividirse en una tabla separada denominada 'color' y correlacionarse con cada artículo alimenticio de una tercera tabla. Por supuesto, el enfoque más abstracto sería generalizar la tabla como 'etiquetas' e incluir cada color como una etiqueta individual que luego puede asignarse a cualquier artículo alimenticio. Luego, puede asignar cualquier número de etiquetas (colores) a cualquier cantidad de alimentos, lo que le proporciona una verdadera relación de muchos a muchos y también libera las designaciones de categoría para que sean más generales.

Sé que hay un debate continuo sobre si las etiquetas son categorías o categorías son etiquetas, etc., pero esta parece ser una instancia en la que podrían ser complementarios y crear un sistema más abstracto y robusto que sea más fácil de administrar.

+0

? Tenía el mismo pensé, no estoy seguro si me he perdido algunas de las posibles consecuencias, pero tiene sentido pensar en los colores como etiquetas. – johnsnails

0

Tema viejo, pero encontré una mejor respuesta a este problema.

Dado que la manzana puede tener un color diferente, su estructura es un gráfico, no un árbol. El modelo de conjunto anidado no es la estructura correcta para eso.

Como mencionas en un comentario que estás usando Mysql, una mejor solución es usar el motor Open Query Graph (http://openquery.com/graph/doc) que es un complemento de mysql que te permite crear una tabla especial donde pones las relaciones, básicamente parentId y childId. Lo mágico es que consulte esta tabla con un pestillo de columna especial, dependiendo del valor pasado en la consulta, le indicará al motor OQGRAPH qué comando ejecutar. Ver los documentos para más detalles.

Cuestiones relacionadas