2010-02-02 6 views
0

Espérant que quelqu'un ici sera en mesure de fournir des conseils mysql ...Comment structurer une requête SELECT pour les éléments suivants

Je travaille sur un système de searchtag catégorique. J'ai des tables comme celles-ci:

EXERCISES 
    exerciseID 
    exerciseTitle 

SEARCHTAGS 
    searchtagID 
    parentID (-> searchtagID) 
    searchtag 

EXERCISESEARCHTAGS 
    exerciseID (Foreign key -> EXERCISES) 
    searchtagID (Foreign key -> SEARCHTAGS) 

Les documents de recherche peuvent être disposés dans un arbre arbitrairement profond. Ainsi, par exemple, je pourrais avoir un arbre de searchtags qui ressemble à ceci ...

Body Parts 
    Head 
    Neck 
    Arm 
     Shoulder 
     Elbow 
    Leg 
     Hip 
     Knee 
Muscles 
    Pecs 
    Biceps 
    Triceps 

maintenant ...

Je veux sélectionner tous les searchtags dans une branche de l'arbre qui font référence au moins UN enregistrement dans le sous-ensemble d'enregistrements référencés par un mot-clé SINGLE dans une branche DIFFERENTE de l'arbre. Par exemple, disons que le champ de recherche "Arm" pointe vers un sous-ensemble d'exercices. Si l'un des exercices de ce sous-ensemble est également référencé par des balises de recherche de la branche "Muscles" de SEARCHTAGS, je voudrais les sélectionner. Donc, ma requête pourrait potentiellement renvoyer "Biceps", "Triceps".

Deux questions:

1) Qu'est-ce que la requête SELECT pour quelque chose comme ça ressemble? (Si une telle chose est possible sans trop ralentir, je ne sais pas trop par où commencer ...)

2) Y a-t-il quelque chose que je devrais faire pour ajuster mon infrastructure de données afin de garantir que cette requête se poursuivra? courir vite - même si les tables deviennent grandes?

Merci d'avance pour votre aide, c'est très apprécié.

Répondre

0

Vous pouvez également utiliser modified preorder tree traversal, également connu sous le nom nested set model. Il nécessite deux champs (gauche et droite) au lieu d'un (parent id), et rend certaines opérations plus difficiles, mais rend la sélection de branches entières beaucoup plus facile.

1

Une idée: envisager d'utiliser une table de cache qui enregistre toutes les relations d'ancêtre dans votre searchtags:

CREATE TABLE SEARCHTAGRELATIONS (
    parentID INT, 
    descendantID INT 
); 

comprennent également la balise elle-même en tant que parent et descendant (donc, pour searchtag avec id 1, la table des relations comprend une rangée avec (1,1).

de cette façon, vous débarrasser des relations parent/descendant et peut se joindre à une table plate. en supposant des "muscles" a l'ID 5,

SELECT descendantID FROM SEARCHTAGRELATIONS WHERE parentID=5 

renvoie tous les tags de recherche contenus dans les muscles.

Questions connexes