6

Tengo una lista, donde cada entrada de lista está etiquetada con varias etiquetas. Cada etiqueta también puede tener etiquetas secundarias. Cada entrada en la lista puede tener más de una etiqueta.La mejor manera de almacenar etiquetas jerárquicas

Por ejemplo, una entrada de lista que habla de automóviles puede tener etiquetas llamadas "automóviles", "vehículos", "ferrari".

Debería poder ver una jerarquía de etiquetas, como se muestra a continuación. Además, no debe haber un límite para la cantidad de etiquetas por entrada, y también para qué tan profundas pueden ser las etiquetas.

¿Cómo almacena esta información? Estoy abierto a usar cualquier tipo de DBMS.

enter image description here

+0

¿Qué tal una base de datos NoSQL? –

Respuesta

5

El enfoque ingenuo sería una solución padre/hijo, pero es muy difícil escribir consultas eficientes con este modelo de datos.

Managing Hierarchical Data in MySQL es un artículo bastante bueno sobre las estructuras de datos jerárquicos. Supongo que la mayor parte se puede aplicar a otros sistemas de bases de datos, también.

+0

¡Gracias por el enlace! Muy informativo. – ashwnacharya

+0

La idea es clara, pero me pregunto qué fácil sería si toda la jerarquía evolucionara con el tiempo. – EFreak

0

uso del formato XML, que le ayudará en el almacenamiento de los nodos como padre e hijo puede tener un número n de nodos y fácil de formar y manejar. Nota: El siguiente es solo un ejemplo, por lo que de esta manera puede manejar los datos.

<Menu> 
    <Menuitem1> 
     <submenu1> 
     <submenu1> 
      <submenu1.1/> 
      </submenu1>   
     </submenu1> 
    </Menuitem1> 

    <Menuitem1> 
     <submenu1> 
     </submenu1> 
    </Menuitem1> 
</Menu> 

Creo que esto puede ayudarlo.

+0

¿Cómo puedo vincular cada elemento a una entrada de la lista? Necesito almacenar las entradas de la lista también. – ashwnacharya

4

Creo que esta es la forma más sencilla para cualquier base de datos: tag (id, name, parent_id), donde parent_id se refiere a id de la etiqueta principal.

1

Está utilizando 2 fuentes de datos, pero parece que está mezclando ambos.

Uno de los datos es la lista de entradas, que parece ser lineal, no jerárquica.

Por ejemplo, una lista de películas.

La otra fuente de datos, es una colección de datos jerárquicos ("catálogo de etiquetas").

Por ejemplo, una lista de estilos de películas.

 
+---Styles 
    +---Comedy 
    +---KidsComedy 
    +---SomeComedy 
    +---LOLComedy 
    +---Action 
    +---SomeAction 
    +---GrabYourCouchSofaAction 
    +---Drama 
    +---SomeDrama 
    +---LotsOfTearsDrama 
    +---EvenToughGuysWillCryDrama 
    +---Horror 
    +---SoftHorror 
    +---HardHorror 
    +---Gore 
    +---SciFi 

Cada película puede estar asociado con varios estilos de película:

  • "Star Wars: La amenaza fantasma": { "de ciencia ficción," SomeDrama", "SoftHorror", "algunaAccion"}
  • "Star Trek: primer contacto": { "de ciencia ficción," SomeDrama", "SomeComedy"}

En términos de diseño de base de datos, usted debe tener unleast 3 mesas o entidad Objetos:

  • lista Entradas = {ListEntryID, ListEntryTitle, ...}
  • película Géneros Etiquetas/Estilos = {TagID, TagTitle, ...}
  • estilos para la película = {TagForListEntryID, ListEntryID, TagID, .. .}

Buena suerte.

+0

Sí. Gracias por tomarse el tiempo para entender mi pregunta. Lo siento si no estaba claro antes. – ashwnacharya

0

Así es como abordaría el problema: Primero, dibujaré un modelo de dominio. En su caso, se ve así:

List(1)----contains----(0..*)-->ListItem 
ListItem(0..1)----hasTags--(0..*)-->Tag 
Tag(0..1)-----hasSubTags---(0..*)-->Tag 

Esto hace explícito el problema sin dejar lugar a dudas.

Ahora, traduzca esto a un modelo de datos. Esto es bastante sencillo: para cada relación, introduzca asignaciones adecuadas de KeyKey-ForeignKey. Las relaciones de Many-to-Many se deben dividir en dos relaciones 1-M usando una tabla nueva en el medio.

El modelo de datos que tiene en este momento debe ser funcionalmente correcto, pero podría tener problemas de rendimiento. Ahora es el momento para que se concentre en las consultas que desea y optimice la estructura de la tabla en consecuencia.

(Otro viaje refinamiento similares a partir del modelo de dominio le dará el diseño del modelo de clase final también)

Esperanza este enfoque ayuda.

0

Ver my answer here. Guardo a los padres para todos los niveles: la creación de árbol y la consulta de todos los descendientes es extremadamente fácil.

Cuestiones relacionadas