Как мне структурировать запрос SELECT для следующего - PullRequest
0 голосов
/ 02 февраля 2010

Надеясь, что кто-то здесь сможет дать какой-нибудь совет по mysql ...

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

EXERCISES
    exerciseID
    exerciseTitle

SEARCHTAGS
    searchtagID
    parentID ( -> searchtagID)
    searchtag

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

Поисковые метки могут быть расположены в произвольно глубоком дереве. Так, например, у меня может быть дерево поисковых тегов, которое выглядит следующим образом ...

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

Сейчас ...

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

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

Два вопроса:

1) Как будет выглядеть запрос SELECT для чего-то подобного? (Если такая вещь вообще возможна без большого замедления. Я не уверен, с чего начать ...)

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

Заранее спасибо за помощь, она очень ценится.

Ответы [ 2 ]

1 голос
/ 02 февраля 2010

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

CREATE TABLE SEARCHTAGRELATIONS (
    parentID INT,
    descendantID INT
);

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

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

SELECT descendantID FROM SEARCHTAGRELATIONS WHERE parentID=5

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

0 голосов
/ 02 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...