接上篇:
操作树的示意图:
-- 具体演示
--新增一个公司简介的兄弟节点 如:最新公告
--步骤1:找到公司简介节点(2,11)max值(11) 以此作为下一个节点的起始值的参考据
--步骤2:推导插入节点的(x,y)的值:参考如下公式(x,y)=(上一个同级节点max值+1,当前级数*子项个数+x+1) =(12,13)
--步骤3:更新所有x>=12 和 y>=13的节点
--步骤4:插入(12,13)
--注意:一定要先更新再插入
UPDATE TestTree SET node_min=node_min+2 WHERE node_min>=12
UPDATE TestTree SET node_max=node_max+2 WHERE node_max>=13
INSERT INTO TestTree VALUES(12,13,2,'最新公告','http://www.csdn.com')
--在刚刚新增的节点(12,13)下创建2个子节点 (13,14) (15,16) =>17 即要更新为(12,17)
UPDATE TestTree SET node_min=node_min+4 WHERE node_min>12
UPDATE TestTree SET node_max=node_max+4 WHERE node_max>13
INSERT INTO TestTree VALUES(13,14,3,'项目方案','http://www.csdn.com')
INSERT INTO TestTree VALUES(15,16,3,'工程进展','http://www.csdn.com')
UPDATE TestTree SET node_max=17 WHERE node_min=12 and node_max=13
--在工程进展(15,16)下创建一个子节点(16,17) 本节点须更新为(15,18)
UPDATE TestTree SET node_min=node_min+2 WHERE node_min>15
UPDATE TestTree SET node_max=node_max+2 WHERE node_max>16
INSERT INTO TestTree VALUES(16,17,4,'市中心花园项目方案','http://www.csdn.com')
UPDATE TestTree SET node_max=18 WHERE node_min=15 and node_max=16
--添加一个市中心花园项目方案(16,17)的兄弟节点 其上级节点为(15,18)
select * from TestTree where node_lvl=3
UPDATE TestTree SET node_min=node_min+2 WHERE node_min>16
UPDATE TestTree SET node_max=node_max+2 WHERE node_max>17
INSERT INTO TestTree VALUES(18,19,4,'市府大楼项目方案','http://www.cnblogs.com')
UPDATE TestTree SET node_max=20 WHERE node_min=15 and node_max=18
只需: select * from TestTree where node_min>=12 and node_max<=21
通过如上的示例 希望你能够看到利用这种算法可以极大的提高的我们程序的性能,需要定位到任意节点只需一条SQL语句就可以了,
避免了传统的通过全盘扫描或递归遍历带来的性能影响.
树形结构的数据库设计可以广泛的应用到 如:权限设计、项目菜单、功能菜单中...
如:以上有什么不对的地方,请及时通知我, 希望能够和高手共同学习、交流!