喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

上一主题 下一主题
 12  1/2  1  2  > 
     
标题: [原创] 实用的傻瓜型无限分类法  
 
aninfeel
注册会员
Rank: 2



UID 72153
精华 0
积分 99
帖子 154
金钱 99 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-4-22
来自 广东惠州
状态 离线
实用的傻瓜型无限分类法

看过各种各样的无限分类方法,在头昏眼花之际,突然觉悟——分类这东西,一旦分好,几乎就不改变了。也就是说在数据库中,什么inset、update的操作很少发生,绝大部分都是select操作。既然这样的话,我们可以在添加修改的时候做多一些额外的事,让查询尽量简单。让查询简单的一种方法是把所有的子类紧挨着放在父类的下面。这样的话,数据表只需要一个用来在查询的时候排序的order和一个表示级别的level字段就足够完成分类功能了。假设表如下:
create table `class` (    `id` int (10)   NOT NULL AUTO_INCREMENT ,  `order` int (11)  ,  `level` int (5)  ,  `other` varchar (100)  , PRIMARY KEY ( `id` )  )

在每次添加分类时,如果加在最后面,order值就是表中最大的那个order+1,如果插在中间,order就是上一个分类的order+1,然后后面的所有分类的order+1。至于是子类父类,就看level值了,反正order比自己小并且level比自己小(level一般是越小级别越大,0表示顶级)的最接近自己的那个就是老爹。

至于查询嘛,查询所有的时候只要"select * from class order by `order`"就行了;
如果只查询其中一个类和他的所有子类的话,会比较麻烦一点点,首先要找出order比自己大level和自己相同的那个类的order号,假设等于nextorder吧,然后where order<nexeorder and order>=selforder就找出来了,sql厉害的用子查询什么的也可以一下子找出来。

[ 本帖最后由 aninfeel 于 2007-6-19 05:53 PM 编辑 ]
2007-6-19 05:52 PM#1
查看资料  发短消息  QQ  顶部
 
细雨清风 (广告位20元/月)
金牌会员
Rank: 6Rank: 6
管理员


UID 71720
精华 0
积分 2992
帖子 361
金钱 7 喜悦币
威望 0
人脉 2985
阅读权限 70
注册 2006-4-15
状态 离线
[推荐阅读] !!北京-六间房视频网站招中级PHP加盟
在说什么?



广告位10元/月 本船以为,性感就是让男人有"想看看这件衣服里面有什么"的欲望的样子.
2007-6-19 05:59 PM#2
查看资料  发短消息  顶部
 
熟人
中级会员
Rank: 3Rank: 3



UID 92185
精华 0
积分 332
帖子 476
金钱 332 喜悦币
威望 0
人脉 0
阅读权限 30
注册 2007-4-29
状态 离线
[推荐阅读] 函数(或方法)应该对它的参数进行判断吗?
他想的应该是左右值分类衍生的东西 但是不知道他是否真正将这个东西做出来过
其实和左右值分类一样用来描述从属关系的字段有两个 并且都需要至少一个对所有节点的横向排序
只不过在查询效率上还不及左右值分类
楼主要确定下一个平级或者上级的节点还需要一个查询 然后才去查询所有的子节点
而左右之结构仅仅根据本节点的左右值数据便可以查询所有子节点的记录




性格:馋 懒 奸 猾 坏
兴趣:吃 喝 嫖 赌 抽
职业:坑 蒙 拐 骗 偷
2007-6-19 07:32 PM#3
查看资料  发短消息  顶部
 
pangmen
注册会员
Rank: 2



UID 93881
精华 0
积分 90
帖子 85
金钱 90 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2007-6-13
状态 离线
[推荐阅读] HTTP 501 未执行/不支持 HTTP 505 版本的问题
无限分类这东东是需要研究一下,当初我用ASP写的一个仿CSDN样式的无限分类就是类似这思路
2007-6-20 12:03 AM#4
查看资料  发短消息  顶部
 
looking_for1
注册会员
Rank: 2


UID 78393
精华 0
积分 112
帖子 304
金钱 112 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-8-15
来自 hubei
状态 离线
[推荐阅读] 最郁闷的事莫过于此!(不是水帖,是真事)
我写了个结合数据库的三级联动select
感觉不是很难   思路清晰些就可以了
不过  这样的情况要求静态化  不然就太消耗资源了




爱我的人们,我一定会爱你们
2007-6-20 10:12 AM#5
查看资料  访问主页  Blog  发短消息  QQ  Yahoo!  顶部
 
aninfeel
注册会员
Rank: 2



UID 72153
精华 0
积分 99
帖子 154
金钱 99 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-4-22
来自 广东惠州
状态 离线
[推荐阅读] php高级开发工程师[北京]
查询多一次是必然的,因为这个已经放弃了右值了,节约了空间当然要牺牲cpu了
2007-6-20 10:52 AM#6
查看资料  发短消息  QQ  顶部
 
熟人
中级会员
Rank: 3Rank: 3



UID 92185
精华 0
积分 332
帖子 476
金钱 332 喜悦币
威望 0
人脉 0
阅读权限 30
注册 2007-4-29
状态 离线
[推荐阅读] 这个米怎么样?
你多了一个表示层级字段 左右值方法就用不着这个字段
字段数还是一样的




性格:馋 懒 奸 猾 坏
兴趣:吃 喝 嫖 赌 抽
职业:坑 蒙 拐 骗 偷
2007-6-20 12:39 PM#7
查看资料  发短消息  顶部
 
looking_for1
注册会员
Rank: 2


UID 78393
精华 0
积分 112
帖子 304
金钱 112 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-8-15
来自 hubei
状态 离线
[推荐阅读] 存储时间记录,是用datetime格式还是时间戳好?
因为数据库里的数据基本上不怎么改变,所以可以生成静态的。
大不了   在数据库发生变化的时候重新生成一次  或者间隔一段时间生成一次




爱我的人们,我一定会爱你们
2007-6-20 01:17 PM#8
查看资料  访问主页  Blog  发短消息  QQ  Yahoo!  顶部
 
熟人
中级会员
Rank: 3Rank: 3



UID 92185
精华 0
积分 332
帖子 476
金钱 332 喜悦币
威望 0
人脉 0
阅读权限 30
注册 2007-4-29
状态 离线
[推荐阅读] 问下面这个函数是干什么用的,请高手看看!谢谢!
生成缓存的方法适用于查询速度慢的结构
如果你认为左右值查询还不够快的话.......
个人感觉左右值结构在查询子节点的时候不存在效率问题 而在更改结构的时候才会出现效率问题




性格:馋 懒 奸 猾 坏
兴趣:吃 喝 嫖 赌 抽
职业:坑 蒙 拐 骗 偷
2007-6-20 03:39 PM#9
查看资料  发短消息  顶部
 
aninfeel
注册会员
Rank: 2



UID 72153
精华 0
积分 99
帖子 154
金钱 99 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-4-22
来自 广东惠州
状态 离线
[推荐阅读] php插入mssql数据异常
既然提到缓存了,用parentId使用递归的方法也一样,只要每次更改结构时更新缓存就行了,查询速度慢的问题也算很好的解决了(这里的缓存不是指smarty的那种缓存,而是指把通过递归等复杂方法生成的数组存到某个方便存取的地方,文件和数据库都行,反正只是读个文件或者select一条数据库数据算是比较快的了)。
2007-6-20 06:28 PM#10
查看资料  发短消息  QQ  顶部
 12  1/2  1  2  > 
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 


Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.023956 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP