嵌套集 - 自下而上的方法

Nested Sets - Bottom Up Approach

从 Mike Hyller 和其他博客撰写的 nested sets 参考文档中,我可以理解 RDBMS 中如何管理层次结构。我还能够为我的一个项目成功实施该模型。我目前正在处理一个也有层次结构的问题,但节点是从底部构建的。我正在使用 MySQL.

假设我有 10 个对象,我最初在 table 中为它们创建行。然后,有一个 table,它具有实现嵌套集模型所需的左右值。所以在这个 table 中,我将这 10 个对象分为两组,比如两个袋子,一个袋子里有 5 个对象,另一个袋子里有 5 个对象(基于某种逻辑)。现在这两个袋子组合在一起形成一个更大的袋子。同样,这些袋子组合在一起形成一个大容器。

我希望这个例子对您来说很清楚,以便您了解我在这里想要实现的目标。这与应用我从顶部构建集合的传统嵌套集合模型相反。

能否请您建议我这里是否可以应用嵌套集?如果是,在插入期间更改更新查询是否足以形成整个层次结构?如果您不建议,还有哪些其他技术可以解决此类问题?

嵌套集模型适用于任何层次结构,只要它是 non-overlapping(即一个 child 最多可以有一个 parent)。

您的模型似乎具有预定义的层次结构("objects"、"bags" 和 "containers" 是具有不同属性的不同实体)。如果确实如此,您根本不需要嵌套集,一组简单的外键约束就足够了。

如果不是(例如,如果 "bag" 可以提升为 "container",或者可以有 "containers" 包含其他 "containers" 等),您确实需要某种层次结构模型,嵌套集也可以作为一个层次结构模型。

实现一个的一种方法是添加对您的引用 "bags" 或 "containers" 或 table 的任何内容,它保存您的 [=24= 的左右值]:

CREATE TABLE nested_sets
    (
    ref BIGINT NOT NULL,
    type INT NOT NULL -- 1 = object, 2 = set, 3 = bag
    left BIGINT,
    right BIGINT
    )

INSERT
INTO    nested_sets
VALUES  (1, 1, 1, 1),
        (2, 1, 2, 2),
        (3, 1, 3, 3), -- 3 objects in bag 1
        (4, 1, 4, 4),
        (5, 1, 5, 5),
        (6, 1, 6, 6), -- 3 objects in bag 2
        (1, 2, 1, 3), -- bag 1, containing objects 1 to 3
        (2, 2, 4, 6), -- bag 2, containing objects 4 to 6
        (1, 3, 1, 6), -- container 1, containing bags 1 and 2 and, by extension, objects 1 to 6

您可能还想将 leftright 字段从 nested_sets table 移动到描述实体的主要 table,或者,或者,您可能希望将所有实体移动到一个 table 中。这取决于您对 "bag"、"container" 和 "object" 的定义有多严格。