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
- mysql--预排序遍历树(数据库级层存储的思考)
- 树 预排序遍历 无限分类( mysql写成存储过程加子节点)删子节点
- 二叉树的遍历(层遍历和深度遍历)
- 树的层遍历
- 数据库用户信息存储设计的一点思考
- 数据库设计 采用左右值编码来存储无限分级树形结构_1 预排序遍历树算法(modified preorder tree traversal algorithm )
- 数据库设计 采用左右值编码来存储无限分级树形结构_2 预排序遍历树算法(modified preorder tree traversal algorithm )
- 【数据结构与算法】二叉树的遍历(递归遍历、非递归遍历、层序遍历)
- 二叉树的层遍历
- 树的层序遍历
- 树的层序遍历
- 带有层号的先根遍历树存储基于plsql的代码实现
- 存储树状结构(下)─预排序遍历树方式
- mysql简单存储过程范例之遍历数据库生成视图
- DTO层的思考
- DTO层的思考
- DTO层的思考
- Mysql数据库的存储引擎
- 基于Android开发需要用到的web技术01_CSS基础
- Java中Socket阻塞的原因
- 代理类实现方法
- 汉诺塔
- 常用正则表达式
- mysql--预排序遍历树(数据库级层存储的思考)
- iOS讲解迷惑深入浅出之GCD利用屏障模拟玩家进入游戏读取数据
- JDBC链接SQLServer详解
- 分布式双活数据中心部署模式
- LRU缓存算法设计
- 安卓相关知识
- 事件监听机制
- colour name
- 并查集(种类并查集)POJ1703Find them, Catch them解题报告