2010-02-02 59 views
0

希望有人在这里将能够提供一些建议的MySQL SELECT查询...如何组织以下

我正在一个明确的searchtag系统。我有类似以下的表格:

EXERCISES 
    exerciseID 
    exerciseTitle 

SEARCHTAGS 
    searchtagID 
    parentID (-> searchtagID) 
    searchtag 

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

Searchtags可以排列在任意深的树中。因此,例如我可能有searchtags的树,看起来像这样...

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

现在...

我想引用至少树的一个分支,选择所有searchtags的ONE记录在树的不同分支中的SINGLE searchtag引用的记录子集中。

例如,假设searchtag“Arm”指向练习的一个子集。如果该子集中的任何练习也被来自SEARCHTAGS的“肌肉”分支的searchtags引用,我想为它们进行选择。所以我的查询可能会返回“二头肌”,“三头肌”。

两个问题:

1)将这样的事情SELECT查询是什么样的? (如果这样的事情甚至可能没有造成很大的减速,我不知道从哪里开始...)

2)有什么我应该做的,以调整我的数据结构,以确保此查询将继续跑得快 - 即使桌子变大了?

在此先感谢您的帮助,非常感谢。

回答

1

一个想法:考虑使用保存在您的searchtags所有祖先关系的缓存表:

CREATE TABLE SEARCHTAGRELATIONS (
    parentID INT, 
    descendantID INT 
); 

还包括标签本身作为父母和后代(所以,对于id为1 searchtag,关系表包括与(1,1)的行。

这样一来,你摆脱父母/后代关系,可以加入平面表。假设“肌肉”的ID为5,

SELECT descendantID FROM SEARCHTAGRELATIONS WHERE parentID=5 

返回肌肉中包含的所有搜索标签。