6

J'ai une liste, où chaque entrée de la liste est étiquetée avec plusieurs balises. Chaque tag peut également avoir des balises enfant. Chaque entrée de la liste peut avoir plusieurs tags.Meilleure façon de stocker les balises hiérarchiques

Par exemple, une entrée de liste qui parle de voitures peut avoir des balises appelées « voitures », « véhicules », « ferrari ».

Je devrais être en mesure d'afficher une hiérarchie des balises, comme indiqué ci-dessous. En outre, il ne devrait pas y avoir de limite au nombre d'étiquettes par entrée, et aussi à quelle profondeur les étiquettes peuvent aller.

Comment stocker ces données? Je suis ouvert à l'utilisation de tout type de SGBD.

enter image description here

+0

Qu'en est-il d'une base de données NoSQL? –

Répondre

5

L'approche naïve serait une solution parent/enfant, mais il est très difficile d'écrire des requêtes efficaces avec ce modèle de données.

Managing Hierarchical Data in MySQL est un très bon article sur les structures de données hiérarchiques. Je suppose que la plus grande partie peut également être appliquée à d'autres systèmes de base de données.

+0

Merci pour le lien! Très informatif – ashwnacharya

+0

L'idée est nette mais je me demande si ce serait facile si toute la hiérarchie évoluait avec le temps. – EFreak

0

Utilisez le format XML qui vous aidera à stocker les noeuds en tant que parent et enfant Il peut avoir un nombre n de nœuds et facile à former et à manipuler. Remarque: Le ci-dessous est juste un exemple, Donc, de cette façon, vous pouvez gérer les données.

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

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

Je pense que cela peut vous aider.

+0

Comment lier chaque élément à une entrée de la liste? J'ai besoin de stocker les entrées de la liste aussi. – ashwnacharya

4

Je pense que c'est la plus simple pour toute base de données ainsi: tag (id, name, parent_id), où parent_id fait référence à id de la balise parent.

1

Vous utilisez 2 sources de données, mais vous semblez mélanger les deux.

une donnée est vos entrées de la liste, qui semble être en ligne directe, non hiérarchique.

Par exemple, une liste de films.

L'autre source de données, est un recueil de données hiérarchiques (« catalogue tags »).

Par exemple, une liste de styles de film.

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

Chaque film peut être associée à plusieurs styles de film:

  • "StarWars: The Phantom Menace": { "SciFi," SomeDrama », "SoftHorror", "uneAction"}
  • "StarTrek: First contact": { "SciFi," SomeDrama », "SomeComedy"}

en ce qui concerne la conception de base de données, vous devriez avoir unleast 3 tables ou objets entité:

  • Liste des entrées = {ListEntryID, ListEntryTitle, ...}
  • Genres film Tags/Styles = {TagID, TagTitle, ...}
  • Styles pour le film = {TagForListEntryID, ListEntryID, TagID, .. .}

Bonne chance.

+0

Oui. Merci d'avoir pris le temps de comprendre ma question. Désolé si ce n'était pas clair plus tôt. – ashwnacharya

0

Voici comment j'aborderais le problème: Tout d'abord, je vais dessiner un modèle de domaine. Dans votre cas, il ressemble à:

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

Cela rend le problème explicite ne laissant aucune place aux doutes.

Maintenant, traduisez cela en un modèle de données. C'est assez simple: pour chaque relation introduisent des mappages PrimaryKey-ForeignKey appropriés. Les relations many-to-many doivent être divisées en deux relations 1-M en utilisant une nouvelle table entre les deux.

Le modèle de données que vous avez à ce stade devrait être fonctionnel, mais pourrait avoir des problèmes de performance. Il est maintenant temps pour vous de vous concentrer sur les requêtes que vous souhaitez et d'optimiser la structure de la table en conséquence.

(Un autre voyage de raffinement similaire à partir du modèle de domaine vous donnera la conception du modèle de classe finale ainsi)

Espoir cette approche aide.

0

Voir my answer here. Je stocke les parents pour tous les niveaux - la construction d'arbres et interroger tous les descendants est extrêmement facile.

Questions connexes