关于在数据库中存储层次数据的一点看法与理解


文章内容引用自:
全面了解数据库设计中分类算法
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、能找到所有子孙节点集合(获取树)。
01.jpg
引用:"在数据库中存储层次数据实现无限级分层"

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

 

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

方案2:递归方法改进
05.jpg

 

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

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

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


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

 

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




ps:

分类算法要解决的问题 

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

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

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

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

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

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

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

6 、如何新增分类? 

在不限制分类的级数和每级分类的个数时,这些问题并不是可以轻松回答的。本文试图解决这些问题。

转载于:https://www.cnblogs.com/kiant71/archive/2010/05/02/1751994.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值