树形结构解决方案

TreeMenu数据表设计结构

字段名

中文名

类型

主键

备注

CodeGUID

自动增长

唯一标识

uniqueidentifier

 

CodeName

层级名

Nvarchar(50)

 

 

ParentCodeGUID

上级层级GUID

uniqueidentifier

 

这里是放上级GUID,假如没有上级这里为null

TreeCode

结构编号

Nvarchar(200)

 

建立非聚集索引(唯一)

TreeLevel

所在层级

int

 

默认值为1

IsDelChild

是否删除子级

tinyint

 

默认值为0

 

 

 

 

 

 

 

解决思路

数据存放形式

CodeGUID

CodeName

ParentCodeGUID

TreeCode

TreeLevel

IsDelChild

1

001

Null

001.

1

0

2

002

Null

002.

1

0

3

001.001

1

001.001.

2

0

4

001.002

1

001.001.

2

0

5

001.001.01

3

001.001.01

3

0

6

001.001.02

3

001.001.02

3

0

7

001.002.01

4

001.002.01

3

0

 

查询方面

1、 查询出所有的数据,这样可以查找出所有的数据,但是建议使用第二种方式查询,这样的好处是在加载数据时只需要使用一个循环就能把数据全部加载完毕,先加载一级目录再加载二级目录这样一层一层的添加数据比较的灵活,不需要使用嵌套循环来加载目录树结构。

a)         Select * from TreeMenu

b)         SELECT * FROM TreeMenu ORDER BY TreeLevel

2、 查询某父级下的所有子级,因为需要查询该父级下的子级,所以肯定知道父级的TreeCode的代码是多少,这样就可以方便查找到该父级下的所有子级,如果只需要获得下一级的子级,那么只需要在WHERE后面加上TreeLevel所在的层级。

a)         SELECT * FROM TreeMenu WHERE TreeCode LIKE ‘父级Code%’ ORDER BY TreeLevel

b)         SELECT * FROM TreeMenu WHERE TreeCode LIKE ‘父级Code%’ AND TreeLevel=所在层级        ORDER BY TreeLevel

 

数据添加

1、 这里在添加数据需要遵循TreeCode层级的模式来添加数据,要保证每层的层级关系,这点是最重要的,只有这样才能保证数据的完整性。

a)         INSERT INTO TreeMenu

(CodeGUID,CodeName,ParentCodeGUID       ,TreeCode,TreeLevel,IsDelChild) VALUES

(newguid(),’ 001’,’上级的GUID’,’001.’,1,0)

 

数据修改

1、 在数据的修改方面,单笔数据的修改,改名字时不需要注意什么事项单独的修改就行了,但是如果修改TreeLevelTreeCode层级关系时需要注意同时修改子级的所有关系才能保证数据的完整,这点非常重要一定不能出错。

a)         UPDATE TreeMenu SET TreeCode=’需要修改的结构名’ WHERE TreeCode LIKE ‘原层级名%’

b)         UPDATE TreeMenu SET TreeCode=’需要修改的结构名’ WHERE TreeCode LIKE ‘原层级名%’ OR TreeCode=’原层级名

 

数据删除

1、 在数据删除下需要考虑到子级的问题,原则上是有子级节点的父级是无法删除的,所以在删除前需要先做判断才能删除数据。

a)         DELETE FROM TreeMenu WHERE CodeGUID=’主键ID’

2、 在删除有子节点的父级数据时,需要一并删除子级。

a)         DELETE FROM TreeMenu WHERE TreeCode LIKE ‘当前层级名%’

3、 考虑到有的项目很特殊,使用者需要删除父级后把所有的子级也全部删除掉,这里就做了一个扩展的方法就是做一个是否允许删除子级的表示IsDeleteChild,当该值等于1时,那么就需要连带的把所有子级的节点全部给删除掉,建议在删除有子级节点的情况下弹出一个提示框给用户确认。

a)         DELETE FROM TreeMenu WHERE TreeCode LIKE ‘当前层级名%’

posted on 2009-12-02 14:36  井盖上的蛤蟆  阅读(393)  评论(0)    收藏  举报

导航