树型结构在我们应用程序中还是很常见的,比如文件目录,bbs,权限设置,部门设置等。这些数
据信息都采用层次型结构,而在我们现在的关系型数据库中很难清淅表达。那么要在程序中遇到树型
结构问题该如何处理呢?
最近笔者通过一个asp权限管理的程序轻松解决了一这问题,现在将其整理出来以飨读者。
首先,要将层次型数据模型转化为关系型数据模型。也就是说如何在我们的access,sql server
,oracle等关系型数据库中设计这个数据结构。
拿个实例来讲吧,譬如下面一个数据:
文档管理 1
----新建文档 2
----文档修改 3
----文档归档 4
----查看归档信息 5
----删除归档信息 6
----删除历史文档 7
----删除正式文档 8
----系统管理 9
----用户管理 10
人事管理 11
行政管理 12
财务管理 13
这是一个很典型的层次型结构数据,那么大家想一想,如何将其通过二维表的形式来表达呢?初
看上去很难,是吧。可是仔细推敲一番还是有门路可钻的。
可以这样,将上面所有的权限视为一个权限字段,那么这个权限字段肯定是要有一个id值的。我
们再给这个关系型数据表再强行加一个字段——隶属id字段,也就是表明这个权限是属于哪一级权限
之下的,即这个id值隶属于哪一个id值。比如:“查看归档信息”权限id值为“5”,它是隶属于“文
档归档”权限之下的,那么它的隶属id字段的值就应该是“4”。ok,如果这一点能理解的话,那么我
们的关系转化工作也就算基本完成了。
下面我们就开始设计这张关系型数据表(以sql server 7.0 为例):
+-----------+-----------+-----------+-----------+----------+
字段名 字段含义 字段类型 字段大小 字段属性
+-----------+-----------+-----------+-----------+----------+
selfid 权限id int 4 pk
powername 权限名 varchar 50 not null
powerinfo 权限信息 varchar 500
belongid 隶属id int 4
+-----------+-----------+-----------+-----------+----------+
好了,结构设计好你就可以轻松输入你的测试数据了。
然后,我们就针对如何在网页中模仿层次结构显示这功能的asp程序,这也是最关键的一步了。
程序清单:powerlist.asp
<%
'数据库连接
set conn=server.createobject("adodb.connection")
conn.open "driver={sql server};server=chaiwei;database=chaiwei;uid=sa;pwd="
'打开所有父层数据
set rs=server.createobject("adodb.recordset")
rs.open "select * from powers where belongid is null order by powerid",conn,1,3
'层次数表态变量赋初值
format_i=1
'列表主程序段
do while not rs.eof
'打印父层数据信息
response.write "<a href='powerlist.asp?selfid=" & rs("powerid") & "&belongid=" & rs("belongid") & "'>" & rs("powername") & "</a>"
response.write "<br>"
'子程序调用,子层数据处理
call listsubpower(rs("powerid"))
rs.movenext
loop
'关闭父层数据集
rs.close
set rs=nothing
'子层数据处理子程序
sub listsubpower(id)
'打开隶属于上层 powerid 的所有子层数据信息
set rs_sub=server.createobject("adodb.recordset")
rs_sub.open "select * from powers where belongid=" & id & " order by powerid",conn,1,3
'列子层数据
do while not rs_sub.eof
'层次数表态变量递进累加
format_i=format_i+1
'循环缩进格式控制,因为顶层与二层不需要缩进,所以从第三层开始引用此程序段
for i=format_i to 3 step -1
response.write " "
response.write " "
next
'打印子层数据信息
response.write " ----"
response.write "<a href='powerlist.asp?selfid=" & rs_sub("powerid") & "&belongid=" & rs_sub("belongid") &"'>" & rs_sub("powername") & "</a>"
response.write "<br>"
'递归调用子程序本身,对子层数据进行逐渐处理
listsubpower(rs_sub("powerid"))
rs_sub.movenext
loop
'层次数表态变量递退累减
format_i=format_i-1
'关闭子层数据集
rs_sub.close
set rs_sub=nothing
end sub
%>
powerlist.asp程序中,我们先打开顶层数据,在循环中显示出来;然后又设计一个子程序listsubpower,通过递归算法在循环中调用,以此来打开子层数据信息,并且在子程序内部循环中又反复调用自己,以此来逐层展开深层数据。
另外,在程序中还用了一个静态变量format_i来控制缩进显示格式。
本文就树型结构在数据设计、程序控制方面做简单尝试,目的在于抛砖引玉,希望读者通过本文得到更多启示。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器