DotNet菜鸟入门之无限极分类(一)设计篇
时间:2011-02-03 来源:庄周梦蝶
首先说明,这个系列的文章,是写给DotNet新手菜鸟的(就像我一样菜的,哈哈),已经算是资深开发的工程师们,可以直接跳过了,当然了,如果高手想来给我们菜鸟一些指点的话,感激不尽。
写这个教程的原因,是因为,无限极分类,在许多项目中,都用得到。而对于新手来说,不是很好理解,同时,操作上也有一些误区或者不当之处。所以我就斗胆,抛砖引玉一下,已一个常见的后台左侧频道树为例子,讲解一下剖析一下无限极分类的实战操作。
既然是写给菜鸟的,那么我就不话结构图了,直接文字+代码来说明吧。
正文
无限极分类的关键就在于数据库设计时,进行了父类编号的记录,从而把所有的分类,链接了起来,成为一个链表样式的结构。
这次我要讲的无限极分类设计如下:
(图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路径字段,用来记录级别的路径记录。
此种无限极分类的设计,就介绍到这里了。下一篇文章,写一下这种设计的操作及相关代码。