welcome to www.mzoe.com
游客:  注册 | 登录 | 会员 | 搜索 | 统计 | 帮助


标题: 无限级分类的实现(非递归)
茫仔
版主
Rank: 7Rank: 7Rank: 7


天下第一美   天下第一好   天下第一善   全球最受关注业余臭美爱好者   金马奖内地最受欢迎自恋狂  
UID 3
精华 0
积分 555
帖子 477
阅读权限 100
注册 2007-7-26
状态 离线
 
发表于 2007-8-1 20:18  资料  个人空间  短消息  加为好友 
无限级分类的实现(非递归)

  一般说来,实现无限级分类要用到递归或者堆栈,不过如果对数据结构不是很熟悉的,这些方法会觉得难以理解。我这里尝试使用其他的方式来实现无限级分类的功能。

  首先建立数据库,然后新建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 编辑 ]





什么时候我才能不臭美呢
顶部
杨盅伟
新手上路
Rank: 1



UID 126
精华 0
积分 22
帖子 22
阅读权限 10
注册 2008-5-11
状态 离线
 
发表于 2008-5-28 22:03  资料  个人空间  主页 短消息  加为好友  QQ
建议我们论坛团结起来!!!

中国的力量当奋勇的战士把一个个受难者救出时,把他们从死神的手里夺过.他们默默地念道:"我刚才又干掉了一个死神."我们中国人是多么的坚强,老天我们让你看清楚,13亿人团结是多么的强大.









我的经典格言:dont waste cheap wow gold your time on maple story a man/woman,who isn't willing to lotro waste their time on you.





顶部