您的位置:首页 > 编程语言 > ASP

ASP无限级分类原理、数据库结构设计、应用及相关函数

2012-09-03 14:02 597 查看
本篇文章以本站无限级分类为例子,讲解无限级分类的原理及应用。

数据库设计

mmFolder表

mmID 自动编号

mmParentID 数字型(长整型) 上级目录ID,如果为根目录,此值为0

mmName 文本型(50) 栏目名称

mmFile表

mmID 自动编号

mmFolderID 数字型(长整型) 所属目录ID——即Folder表的mmID值

....

无限级分类原理

无限级分类主要有两个字段,一个是mmID字段,做为自己标志;另一个就是mmParentID字段,做为自己的上一级标志。如何组织利用这些数据,达到我们想要的效果呢?程序中主要涉及到“替归”的应用。下面举个例子说明一下:

下面是本站的mmFolder表,如下图所示



从上图中可以看出:

1、网站的一级目录有:网站结构、技术文档、数据库、计算机技术、单片机、资源下载、生活等。就是说mmParentID值为0的为一级目录。

2、以一级目录“技术文档”为例,他的mmID值为2——你也可以这样理解,这个2就代表“技术文档”栏目。从上面图中可以看到,mmParent值为2的栏目有:WEB开发、Delphi和VB三个栏目。这三个栏目就是属于一级目录“技术文档”的下一级目录,即二级目录。

3、以二级目录“WEB开发”为例,他的mmID值为11——你也可以这样理解,这个11就代表“WEB开发”栏目。从上面图中可以看到,mmParent值为11的栏目有:ASP、CSS、正则、JavaScript、DLL和FSO,共六个栏目。这六个栏目就是属于二级目录“WEB开发”的下一级目录,即三级目录。

4、当然,还可以根据上面这个原理,无限级分下去。在此不多做说明了。

无限级分类的应用

从上面了解到了无限级分类的原理,那么如何在网站中应用呢?下面举例说明如何应用。

从本站左侧“目录导航”中当前位置为“ASP”栏目,如下图所示:



以栏目“ASP”为例,他的mmID值为12。如何通过这个“当前栏目”的ID来找到他的上级所有目录呢?这里关键就是用到替归。

思路是:通过“ASP”的mmID值,即12,得到他的上一级目录值,即mmParent值。为11。根据这个11,得到他上一级目录的名称,即“WEB开发”。根据mmID=11的mmParent值,为2,可得到他上一级目录的名称,即“技术文档”。根据它的mmID=2的mmParent值,为0,说明已经到了根目录,终止。

替归具体的实现也简单,在此就不多说了。做为程序员,更好的利用替归,提高代码效率,也是件非常有趣的事。

相关函数代码

'======================================================================
'获取目录(栏目)树数组 [分类ID,目录名称,上级目录ID,根目录为0] 返回数组
'======================================================================
Public Function GetFolderTreeArr
IF Not IsArray(Application("FolderTreeArr")) Then
Dim MM,tmpArr:Set MM=New Cls_Public
With MM
.Table="mmFolder"
.FieldsArr=Array("mmID","mmParentID","mmName")
.OrderBy="mmID ASC"
.Conn=OpenDatabase
End With
tmpArr=MM.ResultArr(-1)
Set MM=Nothing:MM=NULL
IF IsArray(tmpArr) Then
Application.Lock
Application("FolderTreeArr")=tmpArr
Application.UnLock
Else
Response.Write "请添加目录!"
Response.End
End IF
End IF
GetFolderTreeArr=Application("FolderTreeArr")
End Function

'取得FolderID为id的目录下所有子目录(包括自己)的FolderID,以半角逗号分开
Function GetAllChildID(id)
dim arrID,tmpArr,N
arrID=id
Dim MM:Set MM=New Cls_Public
With MM
.Table="mmFolder"
.FieldsArr=Array("mmID","mmParentID","mmName")
.Where="mmParentID="&id
.OrderBy="mmID ASC"
.Conn=OpenDatabase
End With
tmpArr=MM.ResultArr(-1)
Set MM=Nothing:MM=NULL
IF isArray(tmpArr) Then
For N=0 To Ubound(tmpArr,2)
arrID=arrID & "," & GetAllChildID(tmpArr(0,N))
Next
End iF
GetAllChildID=arrID
End Function

根据mmFolder表的内容
调用GetAllChildID(2)会得到2,11,14,19,12,18,22,23,24,27
调用GetAllChildID(3)会得到3,20,21

'根据当前目录ID得到这个目录的完整路径
Function FolderPath(id)
dim Pathstr,tmpArr
Dim MM:Set MM=New Cls_Public
With MM
.Table="mmFolder"
.FieldsArr=Array("mmID","mmParentID","mmName")
.Where="mmID="&id
.Conn=OpenDatabase
End With
tmpArr=MM.ResultArr(-1)
Set MM=Nothing:MM=NULL
IF IsArray(tmpArr) Then
For N=0 To Ubound(tmpArr,2)
Pathstr=" > <a href=""Folder" & tmpArr(0,N) &"-1.html"">" & tmpArr(2,N) & "</a>" & Pathstr
if tmpArr(1,N) <> 0 then'父ID不等于0,则该文件夹仍不是根目录,继续遍历。
Pathstr=FolderPath(tmpArr(1,N)) & Pathstr
End IF
Next
End IF
FolderPath = Pathstr
End Function

调用FolderPath(12)得到“首页 > 技术文档 > WEB开发 > ASP”

'根据当前目录ID得到这个顶级目录ID索引;如果已经是顶级目录,返回该顶级目录的索引
'参数curFolder 当前目录的ID
'参数curParentID 当前目录的父ID
Function getFirstID(curFolder,curParentID)
Dim N
IF curParentID=0 Then'已经是顶级目录,返回该顶级目录的索引
getFirstID=curFolder
Exit Function
Else
Dim tmpStr
For N=0 To Ubound(FolderTreeArr,2)
IF FolderTreeArr(0,N)=curParentID Then
IF FolderTreeArr(1,N)>0 Then
tmpStr=getFirstID(FolderTreeArr(0,N),FolderTreeArr(1,N))
Else
getFirstID=FolderTreeArr(0,N)
exit function
End IF
End IF
Next
End IF
getFirstID=tmpStr
End Function

这是我以前blog栏目结构的实现,本篇文章也是当时发布在blog上,现在转到CSDN中,仅供参考。虽然本篇讲述的是ASP无限级分类原理,但同样可以应用到其它语言中。这里主要是阐明无限级分类原理及数据库结构设计及实现思路,欢迎拍砖、交流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐