本篇文章以本站无限级分类为例子,讲解无限级分类的原理及应用。
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无限级分类原理,但同样可以应用到其它语言中。这里主要是阐明无限级分类原理及数据库结构设计及实现思路,欢迎拍砖、交流。