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

本篇文章以本站无限级分类为例子,讲解无限级分类的原理及应用。

数据库设计

mmFolder表

mmID 自动编号
mmParentID 数字型(长整型) 上级目录ID,如果为根目录,此值为0
mmName 文本型(50) 栏目名称

mmFile表
mmID 自动编号
mmFolderID 数字型(长整型) 所属目录ID——即Folder表的mmID值
....

无限级分类原理

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

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

 ASP无限级分类原理、数据库结构设计、应用及相关函数_第1张图片

从上图中可以看出:

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

你可能感兴趣的:(数据库,web开发,function,application,文档,asp)