一般说来,实现无限级分类要用到递归或者堆栈,不过如果对数据结构不是很熟悉的,这些方法会觉得难以理解。我这里尝试使用其他的方式来实现无限级分类的功能。
首先建立数据库,然后新建category表,结构如下:
[id], [name], [parentId], [sort], [leaf]
sql执行语句如下:
CREATE TABLE [dbo].[MZ_article_category] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[parentId] [int] NOT NULL ,
[sort] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[leaf] [int] NOT NULL
) ON [PRIMARY]
其中的leaf是标识是否为最终分类的,sort则是这里最关键的,是一个形如010201的数字串,它的结构要求相当的严格,从左至右分析,两个数字为一个段,如01表示该栏目的最上一级父目录在第一级栏目中的排序为1,02表示该栏目的父目录在第二级栏目中的排序为2,最后的01则表示该栏目在同级栏目中的排序为1。两位数为一段这样做导致一级栏目最多能添加99个栏目,当然这样在实际的操作中已经足够了。
这样的结构,使得生成无限级分类变得相当的容易,无需递归,一句sql语句即可:
select * from [category] order by [sort] asc
当然这样做也有不利的地方,就是在对分类的操作上复杂度会一定程度的增加,比如添加一个新的分类,那么这个新添的分类的上级分类设置需要做相应的改变,而当修改一个分类的时候,则其上级分类,下级分类已经同级的分类都需要做相应的改变。下面举个简单的例子。
某分类如下:
id 名称 父栏目id 排序 叶子
1 体育 0 01 0
3 篮球 1 0101 1
4 足球 1 0102 1
2 娱乐 0 02 0
5 电影 2 0201 1
6 音乐 2 0202 1
我们在篮球栏目下新建一个NBA的栏目,会发生一些改变(用红色标识)
id 名称 父栏目id 排序 叶子
1 体育 0 01 0
3 篮球 1 0101 0
7 NBA 3 010101 1
4 足球 1 0102 1
2 娱乐 0 02 0
5 电影 2 0201 1
6 音乐 2 0202 1
接下来的操作会比较复杂,我们将修改篮球栏目将其转移到娱乐栏目下:
id 名称 父栏目id 排序 叶子
1 体育 0 01 0
4 足球 1 0101 1
2 娱乐 0 02 0
5 电影 2 0201 1
6 音乐 2 0202 1
3 篮球 2 0203 0
7 NBA 3 020301 1
接下来就是删除操作了,我们选择删除音乐栏目:
id 名称 父栏目id 排序 叶子
1 体育 0 01 0
4 足球 1 0101 1
2 娱乐 0 02 0
5 电影 2 0201 1
3 篮球 2 0202 0
7 NBA 3 020201 1
这些操作相对来说比较的复杂,但只要按照这些规则的一步一步的弄应该也是不难的。这样的结构的好处是后期才查询已经栏目之间的排序会变得异常的简单,效率会相当的高。
好了,就写这么多了,等稍微有空点的时候会发一个演示程序上来。
[
本帖最后由 茫仔 于 2007-8-1 20:44 编辑 ]