如何为以下内容构建SELECT查询

时间:2010-02-02 19:48:31

标签: search mysql tags

希望这里有人能够提供一些mysql建议......

我正在开发一个分类搜索标签系统。我有以下表格:

EXERCISES
    exerciseID
    exerciseTitle

SEARCHTAGS
    searchtagID
    parentID ( -> searchtagID)
    searchtag

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

Searchtags可以安排在任意深度的树中。例如,我可能有一个看起来像这样的搜索标签树......

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

现在...

我想选择树的一个分支中的所有搜索标记,这些搜索标记引用树的不同分支中的SINGLE搜索标签引用的记录子集中的至少一条记录。

例如,假设搜索标签“Arm”指向练习的子集。如果该子集中的任何练习也被SEARCHTAGS的“肌肉”分支中的搜索标签引用,我想为它们选择。所以我的查询可能会返回“Biceps”,“Triceps”。

两个问题:

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

2)我是否应该做些什么来调整我的数据结构以确保这个查询能够继续快速运行 - 即使表格变大了?

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

2 个答案:

答案 0 :(得分:1)

一个想法:考虑使用缓存表来保存搜索标签中的所有祖先关系:

CREATE TABLE SEARCHTAGRELATIONS (
    parentID INT,
    descendantID INT
);

还包括标记本身作为父级和后代(因此,对于id为1的searchtag,关系表包含一行(1,1)。

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

SELECT descendantID FROM SEARCHTAGRELATIONS WHERE parentID=5

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

答案 1 :(得分:0)

或者,使用modified preorder tree traversal,也称为nested set model。它需要两个字段(左和右)而不是一个(父ID),并使某些操作更难,但使选择整个分支更容易。