前言

在关系型数据库中,有一种逻辑关系比较难处理,这种就是树形结构。目前有很多主流的处理方案,比如说直接在业务表中存储上一级id,这样就可以用递归查询SQL的形式找到某一节点的父节点,子节点,或者兄弟节点。注意,是递归查询!由于这种father_id的关系键是存储在业务表中,那么递归查询肯定对性能有影响。如果业务表比较小,是可以用这种方法,表结构简单,维护起来比较简单,也很直观。但是业务表如果是百万级别的,这种方式就不太合适了。

现在有另外一种方法,新建一个维护关系的表:闭包表,这种方式是一种以空间换取时间的方法。下面解释一下闭包表如何运作的。

实战

假设,目前存在如下树形结构

树形关系

第一步,新增一个关系表Releation

create table releation(

ancestor varchar

descendant varchar

distacne int

)

其中每一条记录维护一段关系,图示中的关系可以这样维护,如下

表中记录

首先,我们来满足查询,即可以查询某一个节点的父节点,子节点,等等,以B节点为例子

B的所有子孙

select r.descendant from releation r where r.ancestor='B' and r.distacne>0

B的儿子

select r.descendant from releation r where r.ancestor='B' and r.distacne=1

B的第几代(n)孙

select r.descendant from releation r where r.ancestor='B' and r.distacne=n

B的父亲

select r.ancestor from releation r where r.descendant='B' and r.distacne=1

B的所有祖先

select r.ancestor from releation r where r.descendant='B' and r.distacne>0

B的兄弟也包括自己(找到B的父亲,就能找到他的兄弟)

select r.descendant from releation r left join releation r1 on r1.ancestor = r.descendant

and r1.descendant='B' and r1.distacne=1

查询所有的子节点

select ancestor max(distacne) dis from releation group by ancestor having dis=0

然后是新增节点

即为给某一个节点新增子节点,假设该节点还是B,现在给B节点新增一个子节点E

首先,把自己新增进去,SQL:

insert into releation values('E','E',0);

然后找到E的祖先,那么现在E的祖先是B的祖先加上B自己,然后告诉这些祖先们,他们新增了一个后代

通过找祖先的SQL,我们找到了B的祖先,A,那么E的祖先就是B和A

insert into releation values('A','E',2);

insert into releation values('B','E',1);

那么我们可以看出,新增子节点,除了新增自己以外,还需要通知祖先,并让祖先保存自己,下面提供一个伪码,实现该功能

public insert(Node a,Node b){

//1.将自己记录下来

conn.excuteSql(insert into releation values(a,a,0));

//2.查找a的祖先和自己,并告知他们,他们新增的子孙b

List ancestors = conn.excuteSql(select r.ancestor from releation r where r.descendant=a order by distacne);

for(Releation r : ancestors){

conn.excuteSql(insert into releation values(r.ancestor,b,r.distacne+1))

}

}

mysql 存树 闭包表_关系型数据库树形关系存储-闭包表相关推荐

  1. mysql事务四个特性_关系型数据库mysql事务四大特性

    关系型数据库mysql 事务四大特性 一.首先我们先说一下什么是事务 在mysql中对数据进行增删改查中的任何一次操作的过程都可以被认为是一次事务,事务是一系列严密的操作,事务的结束有两种结果,当事务 ...

  2. MySQL数据库是非关系_关系型数据库和非关系型数据库的理解

    综合百度百科和自己的理解整理以下内容,便于日常用到时进行查找,如下: 一.关系型数据库 1.含义: 关系型数据库,是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型 ...

  3. mysql关系型数据库的优点和缺点_关系型数据库和非关系型数据库的区别和特点...

    关系型数据库 采用关系模型来组织数据结构的数据库(二维表) cle    DB2    SQLServer    Mysql     SQLite都是关系型数据库 优点:容易理解,它的逻辑类似常见的表 ...

  4. 建立“图书_读者”数据库及如下 3 个表,并输入实验数据,用 SQL 语句实现如下五个查询(opengauss)

    建立"图书_读者"数据库及如下 3 个表,并输入实验数据,用 SQL 语句实现如下五个查询(opengauss) 题目所涉及的表如下 注:使用opengauss与HeidiSQL: ...

  5. mysql创建全外连接的视图_关系型数据库 MySQL 表索引和视图详解

    原创: JiekeXu JiekeXu之路 一.索引 数据库索引通俗的讲就是和书本的目录一样,主要就是为了提高查询数据的效率.由于数据存储在数据库表中,所以索引是创建在数据库表对象上,由表中的一个字段 ...

  6. 关系型数据库和mysql教材_关系型数据库(MySQL)

    数据库系统DBS(DataBase System):数据库管理系统DBMS(DataBase Management System)+数据库DB(DataBase) [关系型数据库]概念: 表table ...

  7. mysql关系数据库_关系型数据库MySql简介

    什么是关系型数据库? 数据库就是用来存储数据的仓库,是一种特殊的文件. 根据存储的数据不同,划分为关系型数据库和非关系型数据库. 关系型数据库就是指 建立在关系模型基础上的数据库,通俗来讲这种数据库就 ...

  8. mysql数据库实体_关系型数据库中实体之间的关系

    关系型数据库实体间有三种关联关系:一对一,一对多,多对多. 一对一关系(1:1): 如果实体集(表)A 中的每一个实休(就是每行记录),在实体集B中只有一条数据与它对应, 反之实体集B 中的每一个实体 ...

  9. visio连接mysql数据库表_「数据库关系图」使用Visio 2010 画数据库中表与表的关系 - seo实验室...

    数据库关系图 1.在visio中新建数据库模型图 打开visio 2010,文件->新建->数据库->数据库模型图.建立数据库模型图之后,菜单栏多出一个菜单项"数据库&qu ...

最新文章

  1. B - Linear Algebra Test————只给思路
  2. linux lvs公网ip,Linux集群架构(2)LVS介绍、LVS的调度算法、NAT模式搭建、 DR模式、keepalive...
  3. 【多线程高并发】深入浅出可见性
  4. 嵌入式大牛常用的十大C/C++开发利器
  5. boost知识点查阅
  6. nginx配置二级目录,反向代理不同ip+端口
  7. python把utf8编码转为gbk_Python:UTF-8编码转换成GBK编码
  8. getbook netty实战_《Netty实战》Netty In Action中文版 第1章 Netty——异步和事件驱动...
  9. 数据中心能效管理系统有哪些平台功能?一分钟了解
  10. 新网域名转出及阿里云域名转入
  11. 【国家集训队】跳跳棋(LCA+二分答案)
  12. java集合解析(没学过也能理解)
  13. 【Cubieboard2】配置编译内核支持SPI全双工通信驱动
  14. 成功解决百度网盘下载文件时遇到 下载总进度一直处于99.9%,显示一直下载不下来的问题
  15. bigemap大地图软件功能对比分析
  16. JavaScript 隐式类型转换
  17. CEPI扩大与三叶草生物合作,资助“S-三聚体”新冠疫苗候选物全球II/III期临床研究以获上市许可
  18. 计算机辅助制造题库选择题,《机械设计基础习题库
  19. 机械设计与制造类毕业论文文献都有哪些?
  20. HDU 3957 Street Fighter(DLX搜索)

热门文章

  1. C++学习之路 | PTA乙级—— 1018 锤子剪刀布 (20分)(精简)
  2. phpFpm加载php,php-fpm添加service服务的例子
  3. CentOS 7 防火墙命令
  4. 实验四Java_《Java实验四》
  5. 未来计算机是什么结合的产物,计算机未来发展趋势 (2)
  6. JAVA入门级教学之(整数型)
  7. python中list是什么类型_Python中的list数据类型
  8. vue实现一个带搜索功能的列表_(Vue起步)2.模板指令:v-for / v-on / v-model
  9. python办公自动化excel_python办公自动化:Excel操作入门
  10. java造型_java造型_java向上造型有什么作用为什么要造型有什么效果_彩妆阁