采用左右值编码来存储无限分级树形结构的数据库表设计

解析左右无限分类的实现算法 一、引言产品分类,多级的树状结构的论坛,邮件列表等许多地方我们都会遇到这样的问题:如何存储多级结构的数据?在PHP的应用中,提供后台数据存储的通常是关系型数据库,它能够保存大量的数据,提供高效的数据检索和更新服务。然而关系型数据的基本形式是纵横交错的表,是一个平面的结构,如果要将多级树状结构存储在关系型数据库里就需要进行合理的翻译工作。接下来我会将自己的所见所闻和一些实用的经验和大家探讨一下:层级结构的数据保存在平面的数据库中基本上有两种常用设计方法:    * 毗邻目录模式(adjacency list model)    * 预排序遍历树算法(modified preorder tree 立即下载

   之前我介绍过一种按位数编码保存树形结构数据的表设计方法,详情见:
  浅谈数据库设计技巧(上)

  该设计方案的优点是:只用一条查询语句即可得到某个根节点及其所有子孙节点的先序遍历。由于消除了递归,在数据记录量较大时,可以大大提高列表效率。但是,这种编码方案由于层信息位数的限制,限制了每层能所允许的最大子节点数量及最大层数。同时,在添加新节点的时候必须先计算新节点的位置是否超过最大限制。

  上面的设计方案必须预先设定类别树的最大层数以及最大子节点数,不是无限分级,在某些场合并不能采用,那么还有更完美的解决方案吗?通过 google的搜索,我又探索到一种全新的无递归查询,无限分级的编码方案——左右值。原文的程序代码是用php写的,但是通过仔细阅读其数据库表设计说明及相关的sql语句,我彻底弄懂了这种巧妙的设计思路,并在这种设计中新增了删除节点,同层平移的需求(原文只提供了列表及插入子节点的sql语句)。

  下面我力图用比较简短的文字,少量图表,及相关核心sql语句来描述这种设计方案:

  首先,我们弄一棵树作为例子:

商品
|---食品
|    |---肉类
|    |    |--猪肉
|    |---蔬菜类
|          |--白菜
|---电器
     |--电视机
     |--电冰箱

 
采用左右值编码的保存该树的数据记录如下(设表名为tree):
Type_id
Name
Lft
Rgt
1
商品
1
18
2
食品
2
11
3
肉类
3
6
4
猪肉
4
5
5
蔬菜类
7
10
6
白菜
8
9
7
电器
12
17
8
电视机
13
14
9
电冰箱
15
16
 
第一次看见上面的数据记录,相信大部分人都不清楚左值(Lft)和右值(Rgt)是根据什么规则计算出来的,而且,这种表设计似乎没有保存父节点的信息。下面把左右值和树结合起来,请看:
          1商品18
     +---------------------------------------+
                2食品11                                    12电器17
          +-----------------+                     +---------------------+
    3肉类6          7蔬菜类10          13电视机14       15电冰箱16
    4猪肉5           8白菜9
请用手指指着上图中的数字,从1数到18,学习过数据结构的朋友肯定会发现什么吧?对,你手指移动的顺序就是对这棵树的进行先序遍历的顺序。接下来,让我讲述一下如何利用节点的左右值,得到该节点的父节点,子孙节点数量,及自己在树中的层数。
 
假定我们要对节点“食品”及其子孙节点进行先序遍历的列表,只需使用如下一条sql语句:
select * from tree where Lft between 2 and 11 order by Lft asc
查询结果如下:
Type_id
Name
Lft
Rgt
2
食品
2
树形结构左右存储,移动节点详解 最近做一个程序,用到树形结构,并且要存储数据库中。于是研究了一下树形结构左右存储左右虽然取父祖节点和子孙节点,查找节点路径非常方便,但要找某节点的父节点,子节点和兄弟节点就比较困难,所以还要需要一个层级维度方便确定父子和兄弟节点,也就是树形结构中所说的树的深度。 下面列举一些普通的左右算法,网上有大量的资料,就不细说了。 以下资料来自网上,错误的地方我已纠正 一、计算某节点的子孙节点数。 子孙节点数量=(节点右-节点左-1)/2 二、查找某节点的所有子孙节点。 selec.. 阅读详情

相关推荐

采用左右编码存储无限分级树形结构数据库表设计 收藏

采用左右编码存储无限分级树形结构数据库表设计 收藏   之前我介绍过一种按位数编码保存树形结构数据的表设计方法,详情见:浅谈数据库设计技巧(上)  该设计方案的优点是:只用一条查询语句即可得到某个根节点及其所有子孙节点的先序遍历。由于消除了递归,在数据记录量较大时,可以大大提高列表 效率。但是,这种编码方案由于层信息位数的限制,限制了每层能所允许的最大子节点数量及最大层数。同时,在添加新节点的时候必须先计算新节点的位置是否超 过最大限制。  上面的设计方案必须预先设定类别树的

zzbatluzhou的专栏 866

mysql左右树_树形结构左右存储,移动节点详解

最近做一个程序,用到树形结构,并且要存储数据库中。于是研究了一下树形结构左右存储左右虽然取父祖节点和子孙节点,查找节点路径非常方便,但要找某节点的父节点,子节点和兄弟节点就比较困难,所以还要需要一个层级维度方便确定父子和兄弟节点,也就是树形结构中所说的树的深度。下面列举一些普通的左右算法,网上有大量的资料,就不细说了。以下资料来自网上,错误的地方我已纠正一、计算某节点的子孙节点数。子孙...

weixin_33957458的博客 2350

左右编码树状数据存储方案(java实现森林算法)

使用左右编码进行存储树状数据

weixin_43905191的博客 2682

使用左右编码存储无限分级树形结构 (一) -- 理论篇

最近系统平移,涉及到树状数据问题。

1088

采用左右编码存储无限分级树形结构数据库表设计收藏

  之前我介绍过一种按位数编码保存树形结构数据的表设计方法,详情见:浅谈数据库设计技巧(上)   该设计方案的优点是:只用一条查询语句即可得到某个根节点及其所有子孙节点的先序遍历。由于消除了递归,在数据记录量较大时,可以大大提高列表效率。但是,这种编码方案由于层信息位数的限制,限制了每层能所允许的最大子节点数量及最大层数。同时,在添加新节点的时候必须先计算新节点的位置是否超过最大限制。   上

电子商务 asp.net ajax 1578

12.采用左右编码存储无限分级树形结构数据库表设计[摘自网络]

                    之前我介绍过一种按位数编码保存树形结构数据的表设计方法,详情见:ITPUB个人空间9],nI R`b.wN.h  浅谈数据库设计技巧(上)  该设计方案的优点是:只用一条查询语句即可得到某个根节点及其所有子孙节点的先序遍历。由于消除了递归,在数据记录量较大时,可以大大提高列表效率。但是,这种编码方案由于层信息位数的限制,限制了每层能所允许的最大子

java,linux,jboss,myeclipse,eclipse的专栏 858

采用左右编码存储无限分级树形结构数据库表设计

_____________________________________________________________________________________ 声明:此文摘自网络,仅供学习研究之用....

weixin_30763397的博客 91
上一篇: 分页存储过程的一点心得
下一篇: 自定义MembershipProvider来利用Asp.net 2.0 Login控件的登陆和修改密码模块
comiunknown
博客等级 码龄22年 58粉丝 36原创
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值