日期:2014-05-16  浏览次数:20487 次

采用左右编码实现无线分级树形结构
看了 无限级分类的简单算法实现及代码重点讲解  感觉不错。

下面还有一种不错的分级方案页很不错,在实际运用中我对其进行了适当修改。



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

原文: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1586020
作者: bobcy的专栏

无限分级的编码方案——左右值。原文的程序代码是用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        11
3        肉类