2010-02-02 57 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 

返回肌肉中包含的所有搜索標籤。