树形结构解决方案
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、 在数据的修改方面,单笔数据的修改,改名字时不需要注意什么事项单独的修改就行了,但是如果修改TreeLevel和TreeCode层级关系时需要注意同时修改子级的所有关系才能保证数据的完整,这点非常重要一定不能出错。
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 ‘当前层级名%’
浙公网安备 33010602011771号