嵌套集模型:在子节点末尾插入节点

3

现有数据(名称,左值,右值):

Root, 1, 4
Item1, 2, 3

看起来像:

- Root
--- Item1

如何在Item1下方插入一个新节点(Item2)? 我的系统当前的逻辑遵循大部分我在网上找到的例子,但结果是Item2在Item1上方。
- Root
--- Item1
--- Item2

感谢您的帮助。
3个回答

4

将嵌套集模型视为带有lftrgt的XML文件,其中起始和结束标签所在的行:

1  <root>
2   <item1>
3   </item1>
4  </root>

要向root中插入新的子标签,您需要将所有后续记录下移:
1  <root>
2   <item1>
3   </item1>
4   <item2>
5   </item2>
6  </root>

因此,您需要计算item2.lftitem2.rgt(分别是item2.rgt + 1item1.rgt + 2),然后递增所有大于item1.rgt的项目的lftrgt。请注意保留所有HTML标签。
UPDATE  mytable
SET     rgt = rgt + 2
WHERE   rgt > item1.rgt

UPDATE  mytable
SET     lft = lft + 2
WHERE   lft > item1.rgt

第二次更新应该是 WHERE left > item1.lft - 不应该使用right值。 - Esoteric Screen Name
@EsotericScreenName:它还应该将左值与item1.rgt进行比较,否则它会移动item1内部的项目(如果有)。 - Quassnoi
是的,你说得对;我在考虑添加到父级。 - Esoteric Screen Name

2

我认为“正确答案”并不正确,你应该这样做: 将 item2.lft 设为 root.rgt (4) 将 item2.rgt 设为 root.rgt + 1 (5)

更新 mytable 表: 当 rgt ≥ root.rgt 时, 设置 rgt = rgt + 2 root.rgt 现在是 6;

更新 mytable 表: 当 lft > root.rgt 时, 设置 lft = lft + 2 root.lft 保持不变(1),但是如果有多个根节点,它们将被更新。

你不能使用同级条目来确定 lft 和 rgt 值。


1
Root, 1, 6
Item1, 2, 3
Item2, 4, 5

使用ORDER BY ItemName,但这只适用于给定的一组兄弟。

关于如何插入,请参见此处的第5个查询:http://intelligent-enterprise.informationweek.com/001020/celko.jhtml;jsessionid=OOU0L1TIM1IB1QE1GHPSKH4ATMY32JVN

有些人在数字之间放置间隔,以尝试最小化必须执行的UPDATE数量。然而,这种性能问题只能部分缓解,并且是嵌套集模型固有的。因此,许多人实现其他分层模型,例如物化路径


请理解...我正在寻求有关程序逻辑的帮助。 - Rich
那正是我正在寻找的。基于“rgt”而不是“lft”的那个存储过程...完美。 - Rich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接