您的位置:首页 > 数据库 > MySQL

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

2015-09-22 23:01 357 查看
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

//TODO 没写完·
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: