分类的方法
2005-06-05 15:52
155 查看
我的分类的心得. 本文所写的方法,适合中小型数据库的分类,对于分类的级数和个数并没有限制.但是随着分类的增多,对于缓存的占用会加大.当然,几十个甚至上百个分类应该还是承受的了的.这对于中小型网站来说够了.所谓具体问题具体分析了.
最近在写网上商店,分类的方法想了很久.有一种从书上看来的方法是用位编码.假设用32位的整数来编码,一级分类占4位,后面四级每级7位.这样一级可以有24 =16个分类,后面四级每级有27 =128个分类.它这样分的目的在于以下两个问题:
1.如何快速地知道某个类别是否属于另一个类别的子类
2.如何快速地知道某个类别下的所有商品
采用的它的"位与算法"来实现.
但我自己并不是很清楚这种方法.对于其中的程序也没有时间细看了.因为工作比较紧,以后再说了.最终我还是采用了父子类别的分类方法.配合设置多几个字段,可以实现上面的两个问题.再配合application缓存的应用,可以少占用些查询时间和资源.(注:application缓存的方法是从动网论坛的代码里学过来的.)
在网上查到了一种搜索类别路径的方法,及查找所有子类别的方法.这两种方法都是用到了循环嵌套查询,对于它的优化,我选择了使用设置多几个字段来减少查询的次数.具体实现方法为:
数据库字段设置:ID,ParentID,ParentPath,Depth,Child,Name.其中ParentPath是从一级分类到当前分类的父分类的ID的依次排列.Depth为当前类别的深度.定义一级分类的深度为1.Child是当前分类中子分类(不包括孙及以下分类)的个数.目前我还没有用到Child这个属性,不过以后可能会用到.
如果要实现较方便的操作,一定要配合application缓存.这样一些变量就不用再从数据库读取了,大大的节省了时间.
Cache中包括了每一个类别的上述信息,这在编辑类别时尤为重要,可以很方便的更改所属类别等.
对于目录树的实现,我在网上找到了一种用js实现的的下拉菜单目录树.只要给定ID,ParentID,Name就可以了.非常的好用.真是省了我一个大麻烦.具体方法另外再写一篇.
要注意的几点:
1.缓存在更新数据库之后一定要更新,否则会出错.可以针对不同类别只更新其本身及父类的缓存.
2.由于根类是不存在的,一个虚拟的root,所以对于一级分类的相关属性要注意其合理性.例如,它的父类是ROOT,ParentID=0,ParentPath=0这和二级分类相对于一级分类的情况有相似也有不同处.所以需要分情况讨论.
3.对于ParentPath,我目前是用","来分隔每个ParentID,这样做的好处是,在使用查看当前类别的Path的时候,SQL查询中,只要使用 SELECT ... FROM ... WHERE ID IN (....) 这样的语句就可以了.而在确认其有效性的时候,记得要在首尾加上分隔符","例如判断一个ID是否在某类的ParentPath中等.无论何时,都用InStr(","&ParentPath&"," , ","&ID&",")>0 来判断,否则可能出现1,11,111这种分不清的状况.虽说错误很简单,但却是易忽略的东东.
最近在写网上商店,分类的方法想了很久.有一种从书上看来的方法是用位编码.假设用32位的整数来编码,一级分类占4位,后面四级每级7位.这样一级可以有24 =16个分类,后面四级每级有27 =128个分类.它这样分的目的在于以下两个问题:
1.如何快速地知道某个类别是否属于另一个类别的子类
2.如何快速地知道某个类别下的所有商品
采用的它的"位与算法"来实现.
但我自己并不是很清楚这种方法.对于其中的程序也没有时间细看了.因为工作比较紧,以后再说了.最终我还是采用了父子类别的分类方法.配合设置多几个字段,可以实现上面的两个问题.再配合application缓存的应用,可以少占用些查询时间和资源.(注:application缓存的方法是从动网论坛的代码里学过来的.)
在网上查到了一种搜索类别路径的方法,及查找所有子类别的方法.这两种方法都是用到了循环嵌套查询,对于它的优化,我选择了使用设置多几个字段来减少查询的次数.具体实现方法为:
数据库字段设置:ID,ParentID,ParentPath,Depth,Child,Name.其中ParentPath是从一级分类到当前分类的父分类的ID的依次排列.Depth为当前类别的深度.定义一级分类的深度为1.Child是当前分类中子分类(不包括孙及以下分类)的个数.目前我还没有用到Child这个属性,不过以后可能会用到.
如果要实现较方便的操作,一定要配合application缓存.这样一些变量就不用再从数据库读取了,大大的节省了时间.
Cache中包括了每一个类别的上述信息,这在编辑类别时尤为重要,可以很方便的更改所属类别等.
对于目录树的实现,我在网上找到了一种用js实现的的下拉菜单目录树.只要给定ID,ParentID,Name就可以了.非常的好用.真是省了我一个大麻烦.具体方法另外再写一篇.
要注意的几点:
1.缓存在更新数据库之后一定要更新,否则会出错.可以针对不同类别只更新其本身及父类的缓存.
2.由于根类是不存在的,一个虚拟的root,所以对于一级分类的相关属性要注意其合理性.例如,它的父类是ROOT,ParentID=0,ParentPath=0这和二级分类相对于一级分类的情况有相似也有不同处.所以需要分情况讨论.
3.对于ParentPath,我目前是用","来分隔每个ParentID,这样做的好处是,在使用查看当前类别的Path的时候,SQL查询中,只要使用 SELECT ... FROM ... WHERE ID IN (....) 这样的语句就可以了.而在确认其有效性的时候,记得要在首尾加上分隔符","例如判断一个ID是否在某类的ParentPath中等.无论何时,都用InStr(","&ParentPath&"," , ","&ID&",")>0 来判断,否则可能出现1,11,111这种分不清的状况.虽说错误很简单,但却是易忽略的东东.
相关文章推荐
- JAVA方法的分类
- Blog文章分类方法
- Discuz! X3.2 在帖子标题显示分类信息中的某个字段内容的实现方法
- 第四章 基于概率论的分类方法:朴素贝叶斯
- Python编程之基于概率论的分类方法:朴素贝叶斯
- 多标签图像分类任务的评价方法-mAP
- R语言使用boosting方法对数据分类与交叉验证
- 利用分类树方法设计测试用例
- php无限级分类实现方法分析
- 基于视觉的视频分类传统方法
- [转]IP QoS的流分类方法详解
- php无限极分类各种方法总结
- 机器学习——基于概率论的分类方法:朴素贝叶斯
- lambda表达式使用方法详解 分类: python 2013-03-15 10:58 396人阅读 评论(0) 收藏
- 文本数据的机器学习自动分类方法
- 数据SQl分类汇总方法
- 09-给NSString增加一个对象方法(分类练习02)
- 在多标签分类中,准备mulan开源软件所需要的.arff和.xml数据的方法
- 新闻上的文本分类:机器学习大乱斗 王岳王院长 王岳王院长 5 个月前 目标 从头开始实践中文短文本分类,记录一下实验流程与遇到的坑 运用多种机器学习(深度学习 + 传统机器学习)方法比较短文本分类处
- ios基础之关闭输入框的几种常见方法集锦 分类: ios开发 2015-04-01 19:33 134人阅读 评论(0) 收藏