随笔-7  评论-24  文章-102  trackbacks-0


文章内容引用自:
全面了解数据库设计中分类算法
http://blog.csdn.net/hyzhx/archive/2008/03/21/2201465.aspx

在数据库中存储层次数据实现无限级分层
http://www.52web.com/52article/?view-250.html
http://www.thinkly.cn/index.php/archives/354

商品无限分类的算法如何优化?
http://www.javaeye.com/topic/170744

      关于无限分类的设计网上讨论有很多,说白了就是在数据库中设计树的问题,在这里仅对我所知的做些记录与对比。
假设表结构为下图,并且为某表的外键引用。要求:
1、实现无限层次。
2、能找到节点的路径。
3、能找到所有子孙节点集合(获取树)。

引用:"在数据库中存储层次数据实现无限级分层"

 


方案1:邻接列表模型(The Adjacency List Model)/递归方法
http://www.52web.com/52article/?view-250-page-2.html
 
引用:"在数据库中存储层次数据实现无限级分层"

 

优点:结构简单明了,对于节点的维护并不需要额外的工作。
缺点:实现要求2、3需要进行大量的递归操作,每一次数据库查询都需要花费一点时间。
 


方案2:递归方法改进


 

对方案1的扩展,新增 path字段以存储节点路径,arrayChild字段存储其下所有节点。

优点:实现要求1、2只需要一次查询。
缺点:当节点发生改变时需要维护对应的字段,且 path与 arrayChild以拼串形式存储于文本字段,容易限制节点长度,并且对于查询效率有影响。

 


方案3:改进前序遍历树
http://www.52web.com/52article/?view-250-page-2.html



如果作为主键标识的节点编号存在外部引用,还需要定义一个链表编号 linkId来确保其主键标识固定,并重新定义其链表左右范围。

 

优点:实现要求1、2只需要一次查询,但比方案2维护起来更见方便(减少大量的拼串),而且因为左右值表示的是链表的范围,所以查询效率更高。
缺点:算法未经说明前不如方案1、2直观。 




ps:
分类算法要解决的问题 

      在网站建设中,分类算法的应用非常的普遍。在设计一个电子商店时,要涉及到商品分类;在设计发布系统时,要涉及到栏目或者频道分类;在设计软件下载这样的程序时,要涉及到软件的分类;如此等等。可以说,分类是一个很普遍的问题。 

我常常面试一些程序员,而且我几乎毫无例外地要问他们一些关于分类算法的问题。下面的举几个我常常询问的问题。你认为你可以很轻松地回答么? 

1、分类算法常常表现为树的表示和遍历问题。那么,请问:如果用数据库中的一个Table来表达树型分类,应该有几个字段? 

2、如何快速地从这个Table恢复出一棵树? 

3、如何判断某个分类是否是另一个分类的子类? 

4、如何查找某个分类的所有产品? 

5、如何生成分类所在的路径。 

6、如何新增分类? 

在不限制分类的级数和每级分类的个数时,这些问题并不是可以轻松回答的。本文试图解决这些问题。
posted on 2010-05-02 10:48 黄小二 阅读(635) 评论(0)  编辑  收藏 所属分类: [DB]

只有注册用户登录后才能发表评论。


网站导航: