写这个教程的原因,是因为,无限极分类,在许多项目中,都用得到。而对于新手来说,不是很好理解,同时,操作上也有一些误区或者不当之处。所以我就斗胆,抛砖引玉一下,已一个常见的后台左侧频道树为例子,讲解一下剖析一下无限极分类的实战操作。

      既然是写给菜鸟的,那么我就不话结构图了,直接文字+代码来说明吧。

 

正文

      无限极分类的关键就在于数据库设计时,进行了父类编号的记录,从而把所有的分类,链接了起来,成为一个链表样式的结构。

      这次我要讲的无限极分类设计如下:

         image

 

(图1)

创建的表的sql语句如下,具体字段的说明见(图1)

CREATE TABLE Channel(
[id] [varchar](2000) NOT NULL,
[channelName] [nvarchar](50) NOT NULL,
[linkUrl] [varchar](200) NULL,
[parentID] [varchar](2000) NOT NULL,
[childNum] [int] NOT NULL,
[orderNum] [int] NOT NULL
)
其中,约定的基类编号为C,也就是说,第一级的分类,父编号为C,第一个分类的编号为C001
它的第一个子类编号为001,也就是说,每一级子类的编号为父类编号+ 000格式的数字。
举例如下(名称 编号 父编号):
  
|-食物 C001 C
|-----蔬菜 C001001 C001
|---------白菜 C001001001 C001001
|---------萝卜 C001001002 C001001
|---------冬瓜 C001001003 C001001
|-----水果 C001002 C001
|---------苹果 C001002001 C001002
|---------橘子 C001002002 C001002
 

说明:

这样设计的优点:

1)只要知道这个分类的编号,那么去掉后三位,就是此类的父类编号。例如,食物这个类别,代码是C001,那么去掉后三位,他的父编号就是C,而蔬菜这个类别,代码是C001001,去掉后三位,他的父类编号就是C001.

如此,只要知道了一个分类的编号后,就不用再去查询数据库,找他的父类编号了。可以直接用程序算出,他的父类编号。

2)方便的知道这个类别的深度,也就是几级分类。算法就是——(分类编号长度-1)/3。

例如,食物这个分类的编号为 C001,那么他的分类级别为: (4-1)/3 = 1。

那么蔬菜这个分类的级别就是: (7-1)/3 = 2。为2级分类。

3)可以程序直接算出所有的父类,省去了递归的过程。

例如冬瓜这个分类,循环去掉三位后,得到他的父类编号依次为:

C001001 、 C001 、 C

设计的缺点:

1)主键不是数字类性,相对数字为主键的索引来说,速度稍慢,不过好在数据不会太多。

2)扩展性不是很好,可以看出,这个无限极分类,同级别的分类最多只能分到999级别,即C001到C999,如果你想更多,那么可以设定为 C0001到C9999即9999个同类级别。不过一般说是无限极分类,但是999的同级别,一般情况下,就够用了。

主要还是看需求来指定,是否是使用数字为主键和父类编号的分类,还是用字符的。

提示:如果使用数字作为主键和父类编号,那么需要增加一个path路径字段,用来记录级别的路径记录。

此种无限极分类的设计,就介绍到这里了。下一篇文章,写一下这种设计的操作及相关代码
posted on 2018-05-11 15:50  无爱无伤  阅读(542)  评论(0编辑  收藏  举报