嵌套集 - 自下而上的方法

时间:2017-11-07 13:51:37

标签: mysql database rdbms hierarchical-data nested-sets

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

考虑我有10个对象,我最初在表中为它们创建行。然后,有一个表具有实现嵌套集模型所需的左右值。所以在这张表中,我将这10个对象分成两组,比如说两个包,一个包里有5个对象,另一个包里有另外5个对象(根据一些逻辑)。现在这两个袋子组合在一起形成一个更大的包。同样,这些袋子组合在一起形成一个大容器。

我希望您能够清楚地了解我想在这里实现的目标。这与应用传统嵌套集模型相反,我从顶部构建集合。

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

1 个答案:

答案 0 :(得分:1)

嵌套集模型适用于任何层次结构,只要它不重叠(即一个子节点最多只能有一个父节点)。

您的模型似乎具有预定义的层次结构(“对象”,“包”和“容器”是具有不同属性的不同实体)。如果确实如此,您根本不需要嵌套集,只需一组简单的外键约束即可。

如果不是(例如,如果“bag”可以提升为“容器”,或者可以有“容器”包含其他“容器”等),则需要具有某种层次结构确实,模型和嵌套集合也可以作为一个集合。

实现一种方法的一种方法是在表格中添加对“bag”或“容器”的引用或其他任何内容,其中包含“对象”的左右值:

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表移动到描述实体的主表中,或者,您可能希望将所有实体移动到单桌。这取决于你对“bag”,“container”和“object”的定义有多严格。