接上篇:
 
操作树的示意图:

 

   -- 具体演示

    --新增一个公司简介的兄弟节点 如:最新公告 
    --步骤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语句就可以了,

避免了传统的通过全盘扫描或递归遍历带来的性能影响.

       树形结构的数据库设计可以广泛的应用到 如:权限设计、项目菜单、功能菜单中...

        如:以上有什么不对的地方,请及时通知我, 希望能够和高手共同学习、交流!

posted on 2009-05-14 00:27  feiyang68  阅读(760)  评论(0编辑  收藏  举报