2010-02-02 2 views
0

Надеясь, что кто-то здесь будет в состоянии предоставить некоторые MySQL советы ...Как структурировать SELECT, запрос на следующий

Я работаю на категорический системе searchtag. У меня есть таблицы, похожие на следующие:

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 

Теперь ...

Я хочу, чтобы выбрать все searchtags в одной ветви дерева, что ссылка, по крайней мере ОДНА запись в подмножестве записей, на которые ссылается одномерный поиск в РАЗЛИЧНОЙ ветке дерева.

Например, скальп «Arm» указывает на поднабор упражнений. Если какое-либо из упражнений в этом подмножестве также ссылается поисковыми тегами из ветви «мышц» ПОИСКА, я бы хотел выбрать для них. Поэтому мой запрос может потенциально вернуть «Бицепс», «Трицепс».

Два вопроса:

1) Что бы ВЫБРАТЬ запрос на что-то, как это выглядит? (Если такое возможно даже без большого замедления, я не уверен, с чего начать ...)

2) Что-нибудь я должен сделать, чтобы настроить мою структуру данных, чтобы этот запрос продолжался бежать быстро - даже когда таблицы становятся большими?

Заранее благодарим вас за помощь, это очень ценно.

ответ

0

В качестве альтернативы используйте modified preorder tree traversal, также известный как nested set model. Он требует два поля (слева и справа) вместо одного (родительский идентификатор) и делает определенные операции сложнее, но значительно облегчает выбор целых ветвей.

1

Идея: рассмотреть вопрос об использовании таблицы кэша, который сохраняет все отношения предка в ваших searchtags:

CREATE TABLE SEARCHTAGRELATIONS (
    parentID INT, 
    descendantID INT 
); 

включает также тег себя как родитель и потомок (так, для searchtag с идентификатором 1, таблица отношений включает в себя ряд с (1,1).

Таким образом, вы избавитесь от родителя/потомка отношений и может присоединиться к плоской таблицы. Предполагая, что «мышцы» имеет идентификатор 5,

SELECT descendantID FROM SEARCHTAGRELATIONS WHERE parentID=5 

возвращает все поисковые теги, содержащиеся в мышцах.