【问题标题】:How do I structure a SELECT query for the following如何为以下内容构建 SELECT 查询
【发布时间】:2010-02-02 19:48:30
【问题描述】:

希望这里有人能够提供一些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

现在...

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

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

两个问题:

1) SELECT 查询这样的事情会是什么样子? (如果这样的事情甚至可以在没有造成很多减速的情况下发生。我不知道从哪里开始......)

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

提前感谢您的帮助,非常感谢。

【问题讨论】:

    标签: search mysql tags


    【解决方案1】:

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

    CREATE TABLE SEARCHTAGRELATIONS (
        parentID INT,
        descendantID INT
    );
    

    还包括标签本身作为父代和后代(因此,对于 id 为 1 的搜索标签,关系表包含一个带有 (1,1) 的行。

    这样,您就可以摆脱父/子关系并可以加入平面表。假设“Muscles”的 ID 为 5,

    SELECT descendantID FROM SEARCHTAGRELATIONS WHERE parentID=5
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-09
        • 2020-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多