分类的方法

来源:互联网 发布:淘宝网店转让靠谱吗 编辑:程序博客网 时间:2024/04/30 05:52

    我的分类的心得. 本文所写的方法,适合中小型数据库的分类,对于分类的级数和个数并没有限制.但是随着分类的增多,对于缓存的占用会加大.当然,几十个甚至上百个分类应该还是承受的了的.这对于中小型网站来说够了.所谓具体问题具体分析了.

    最近在写网上商店,分类的方法想了很久.有一种从书上看来的方法是用位编码.假设用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这种分不清的状况.虽说错误很简单,但却是易忽略的东东.

原创粉丝点击