Mysql实现树型结构,数据库上常见有2种方式:领接表、预排序遍历树(MPTT)。

领接表方式——

主要依赖于一个 parent 字段,用于指向上级节点,将相邻的上下级节点连接起来,id 为自动递增自动,parent_id 为上级节点的 id。

领接表方式的优点在于容易理解,代码也比较简单明了。缺点则是递归中的 SQL 查询会导致负载变大,特别是需要处理比较大型的树状结构的时候,查询语句会随着层级的增加而增加,WEB 应用的瓶颈基本都在数据库方面,所以这是一个比较致命的缺点,直接导致树结构的扩展困难重重。

排序遍历树方式

现在我们来聊聊第二种方式─预排序遍历树方式(即通常所说的 MPTT,Modified Preorder Tree Traversal)。此算法是在第一种方式的基础之上,给每个节点增加一个左、右数字,用于标识节点的遍历顺序,如下图所示:

从根节点开始左边为 1,然后下一个节点的左边为 2,以此类推,到最低层节点之后,最低层节点的右边为其左边的数字加 1。顺着这些节点,我们可以很容易地遍历完整个树。根据上图,我们对数据表做一些改变,增加两个字段,lft 和 rgt 用于存储左右数字( left 和 right 是 MySQL 的保留字,所以改用简写)。

可以看出,由于MPTT方式存储不仅包含隶属关系,还包括了顺序,因此在读取子树时不需递归,效率大大提高。

下面面讨论下如何在这两着间转换.

MPTT转领接表比较容易,只要寻找层级比当前节点小1,且lft当前节点rgt的节点,即为父节点。

领接表转MPTT,一般直观想到的是递归生成。但是这个不是尾递归,递归层数有限制, mysql没有数组自建堆栈要用表,效率很低,怎么办?

笔者设计了一个近似递推的算法,分享一下:

首先确定问题:领接表结构(id,pid),目标MPTT表结构(id,lvl,lft,rgt)。

为处理需要,MPTT表增加cnt、seq字段,用于记录节点及其子节点的个数、在MPTT中遍历的序号。

处理过程算法如下:

1】根节点,转入MPTT表,令lvl=1,lft=1,rgt=null,cnt=null,seq=1;

2】逐层处理p的子节点,lvl+1;

3】从最底层(lvl最大)向上(lvl递减)处理各层的节点,cnt=子节点的cnt数+1

4】从最上曾(lvl=1)向下(lvl递增)处理各层的节点,seq=父节点seq+ sum(id小于本节点的兄弟节点的cnt)+1

5】对每一个节点,lft=seq*2-lvl,rgt = lft +cnt *2 -1

处理结束;

此算法已在项目中应用,代码是有版权的,就不贴了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

原文:http://blog.csdn.net/cnemon/article/details/46696729

mysql 转成树_Mysql树型结构2种方式及相互转换相关推荐

  1. TREE 树型结构 的存储方式

    对于组织架构中的员工层次关系我们应该怎么建模呢? 如下图所示: 此类结构通常有两个主要特点: 1.一个孩子有且只有一个父亲 2.树的深度不确定 为了解决这种结构,我们一般会建一张下面的表: 方案一(A ...

  2. mysql怎么对比表结构_mysql查看表结构2种方式对比

    C语言之带有返回值的函数 带有返回值的函数 语法: 类型 函数名(参数列表){ 函数体; return 数据; } 例: int getSum(int num1,int num2){ int sum ...

  3. dtree和jquery构建树型结构

    对于小型的树型应用来说,dtree是一个不错的选择. 先看一眼dtree给的例子 构造静态树 首先引入css文件和js文件 <link rel="StyleSheet" hr ...

  4. 数据结构与算法3(树型结构)

    树型结构 树形结构: 1.树的基本概念 2.树的表示方法:倒悬树.嵌套法.凹凸法 3.树的专业术语(不同资料略有不同) 4.树的存储 双亲表示法 顺序 孩子表示法 兄弟表示法 树形结构: 1.树的基本 ...

  5. 【唠叨两句】如何将一张树型结构的Excel表格中的数据导入到多张数据库表中...

    小弟昨天遇到一个相对比较棘手的问题,就像标题说的那样.如何将一张树型结构的Excel表格中的数据导入到多张数据库表中,在现实中实际是七张数据库表,这七张表之间有着有着相对比较复杂的主外键关系,对于我这 ...

  6. EF架构~单表一对多集合的插入(树型结构)

    单表一对多关系很常见,它是一种树形结构,如系统菜单表,部门表,分类表,这些都可以做成单表一对多关系,而这些表做成一对多关系后,如果通过EntityFramework进行插入操作时,会很方便,EF会自动 ...

  7. C#实现树型结构TreeView节点拖拽的简单功能,附全部源码,供有需要的参考

    为什么80%的码农都做不了架构师?>>>    应用软件是否好用就体现在一些细节操作上,开发人员是否考虑到了很多细节,例如一个树形结构的数据若不支持拖拽功能那用起来会很糟糕一些,用户 ...

  8. go之树型结构深度理解补充

    go之树型结构深度理解补充 在上一篇中借用了 Ilija Eftimov 文章来讲解了tree的定义和一些方法.这篇文章主要是讲解在树型结构中如何判断节点与节点之间的关系. A节点是否是B节点的直接上 ...

  9. Nestable 可移动拖拽的树型结构的使用(jQuery)

    利用jQuery可以制作出很好的树型结构.这里介绍一款最近才找到使用的Nestable 可以拖动.  网页中的效果 http://dbushell.github.com/Nestable/ 具体详细介 ...

最新文章

  1. AI也会查水表啦!德国小哥开发水表读取器,可OTA升级,成本不到80元
  2. Windows 08 R2_组策略
  3. 为Visual C++ 6.0添加批量注释和取消批量注释功能
  4. SQL Cookbook:一、检索记录(1)从表中检索所有行和列
  5. Objective-C基础教程学习笔记(九)内存管理
  6. jupyter 方框 汉字,jupyter画图中文显示乱码问题解决办法
  7. 如何更改Spring Boot应用程序的默认端口
  8. 13-容器的端口映射
  9. 【天梯选拔月赛】寻宝路线(dp)
  10. 【Android】通过芝麻认证进行实名认证
  11. arcsinx用计算机怎么按,数学arcsinx和arccosx怎么用公 – 手机爱问
  12. [翻译]《Programming - Principles and Practice Using C++, Second Edition》- Chapter 1
  13. 微信小程序开发入门需要学什么?
  14. Reverse-2 - PE文件
  15. 单工、半双工及全双工之间的区别
  16. Dubbo之——Dubbo服务集群
  17. 【实战】python-docx---每页表格固定显示行数
  18. php添加本地搜索,十分钟,在本地搭建一个搜索引擎
  19. 普通话智能测试系统软件,普通话智能学习软件(普通话水平测试仿真系统) iso光盘版...
  20. C#中窗体间传递数据的几种方法

热门文章

  1. Eclipse的vim插件viPlugin的安装
  2. [C#] NPOI Excel解析
  3. 初始化参数文件修改错误导致Oracle无法startup
  4. UiAutomator喷射事件的源代码分析
  5. android 纯c/c++开发(转)
  6. java排序学习笔记
  7. sqlserver2008安装报错 “Previous releases of Microsoft Visual Studio 2008″ failed.
  8. postgreSQL源码分析——索引的建立与使用——Hash索引(1)
  9. 如何插卡虚拟机 mysql_怎么在虚拟机中搭建mysql服务器
  10. 安卓设置原生alert设置圆角_安卓手机设置充电提示音全新最全教程