从Mike Hyller和其他博客撰写的nested sets参考文档中,我可以了解RDBMS中如何管理层次结构。我还能够为我的一个项目成功实现该模型。我目前正在研究一个也具有层次结构的问题,但是节点是从底部构建的。我正在使用MySQL。
考虑到我有10个对象,我最初在表中为它们创建行。然后,有一个表,该表具有实现嵌套集模型所需的左右值。因此,在此表中,我将这10个对象分为两组,例如两个袋子,一个袋子中的5个对象和一个袋子中的其他5个对象(基于某种逻辑)。现在,将这两个袋子组合在一起以形成一个更大的袋子。同样,这些袋子被组合在一起以形成一个大容器。
我希望这个例子对您很清楚,让我对这里要达到的目标有所了解。这与应用传统的嵌套集模型相反,在传统的嵌套集模型中,我从顶部开始构建集。
您能否建议我是否可以在此处应用嵌套集?如果是,在插入过程中更改更新查询是否足以构成整个层次结构?如果您不建议,还有哪些其他技术可以用来解决此类问题?
最佳答案
嵌套集模型适用于任何层次结构,只要它不重叠(即一个孩子最多可以有一个父级)即可。
您的模型似乎具有预定义的层次结构(“对象”,“袋子”和“容器”是具有不同属性的不同实体)。如果确实如此,那么您根本不需要嵌套集,那么简单的一组外键约束就足够了。
如果不是这样(例如,如果可以将“袋子”提升为“容器”,或者可以有包含其他“容器”的“容器”等),则您确实需要具有某种层次结构模型,嵌套集也可以作为一个。
一种实现方式是在您的“ bags”或“ containers”中添加引用,或在包含“ objects”左右值的表中添加引用:
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
您可能还希望将
left
和right
字段从nested_sets
表移动到描述实体的主表中,或者,也可以将所有实体移动到单个表中。这取决于您对“袋子”,“容器”和“对象”的定义有多严格。关于mysql - 嵌套集-自下而上的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47159654/