mysql--预排序遍历树(数据库级层存储的思考)

来源:互联网 发布:linux rpm yum 编辑:程序博客网 时间:2024/06/08 10:30

    1:当我们要在数据库中存储一种级层关系,我们怎样存储呢?

          1.1 比如说我要存储一种水果,水果又有香蕉,苹果等他们都有一些自我的属性。我们一般的想法就是先建一个fruit主表,然后一个表主键与fruit建立外键。 

          1.2还有如果我们存储一些地理位置(即有地区级,市级,县级的关系),并且只允许建一张表,我们的想法是在建表的时候多加一个字段parent,让parent关联到下一个子级。 如下图所示:     


          1.3以上两种的级层关系都是说的是一种横向的关系,也就是说他们的关系横向数据关系比较多。所以当一种关系横向关系比较多的时候用一个parent关联子节点是一个飞涨有效的做法。但是当层级关系是纵向的话,若在使用这种方法是一个非常差劲的做法。因为如果纵向结构非常长的话,我要查一个节点的下级所有子节点必须在代码中进行for循环遍历,这个查找过程是一个非常耗时的过程,因此便有了预排序遍历树算法。预排序遍历树是将层级关系在数据库中存储为一种树的结构,从而使查询的时间复杂度降低。


         2.分析预排序遍历树

           预排序遍历树就是建一个表它有left节点,right节点和parent节点,如下图所示:

         如果在数据库中把数据这样存储,我们想要查询一个节点的它的所有的下属节点,则只需要lft>this.lft && rgt<this.rgt就可以查询出来,遍历整个树,查询子集 条件:左边 > 父级L, 右边 < 父级R  所以是非常高效的。

         查询方便了,自然会降低写的效率了,这也符合时空学说。接下只要是来维护这个遍历树了,需要来写存储函数来处理这个遍历树。

         2.1新增节点

          算法详解: 
          1.所有分类 左边和右边的值 > 插入节点的左边节点记录的右值 的全部 + 2
          2.插入节点 左值 = 插入位置左边节点记录的右值 + 1, 右值 = 插入位置左边节点记录的右值 + 2
          例子:
           在 R = 9(L8, R9)与 L = 10(L10,R11) 节点之间插入一个新节点
          那么所有 左值 和 右值 > 9 的节点的左值和右值需要 + 2
          例如新节点右边的节点(L10,R11)左值右值都需要 + 2 那么插入后的新值为 L12 R13
          新节点的左值为 9 + 1 = 10 右值为 9 + 2 = 11

         

          参考blog: http://be-evil.org/post-168.html




         



1 0
原创粉丝点击