在关系型数据库中储存树形结构

news2024/12/24 9:54:27

adjacency list

邻接表显然是最简单的方式,也是在实践中经常用到的。其储存节点以及直接父节点来进行储存树形结构

邻接表结构简单,查询修改节点的直接父节点都很容易。然而如果返回父节点下的所有节点之类的跨层操作那就很麻烦了,需要频繁进行递归。

因此邻接表比较适合层次简单,或者基本只对直接父子节点进行操作的场景

idnameparent_id
1computer0
2apple1
3rog1
4mac air m22

path enumeration

储存根节点到本节点完整路径。

新增修改都比较容易,直接增加修改路径即可。对于查询就相对比较麻烦了,需要通过like之类的,并且完整路径很有可能会超出索引的最佳长度,对查询性能有损耗

在实践中常常与邻接表一起结合使用

idnameparent_id
1computer0
2apple1
3rog1
4mac air m22

nested set

嵌套集合模型是根据遍历树对节点进行编号,遍历树对每个节点进行两次访问,按访问的顺序分配编号,并且在两次访问时都进行编号。这给每个节点留下了两个数字,存储为两个属性。查询变得不昂贵:可以通过比较这些数字来测试层次成员关系。更新需要重新编号,因此代价很高。使用有理数而不是整数的细化可以避免重新编号,因此更新速度更快,尽管要复杂得多

left是前序遍历的第一次访问,right则是第二次访问。比如对于下表中的mac air m2是第3步时发生了第一次访问,同时由于是最左子节点,因此会发生返回,那么第4步发生了第二次访问。

idnameleftright
1computer18
2apple25
3rog67
4mac air m234

wiki中有一个很好的图展示了left、right的计算

在这里插入图片描述

nested set方法查询删除所有子节点非常快,然而模型较为复杂,插入移动极为麻烦,需要重建left、right。

因此,nested set更适用于层次比较复杂,查询远远大于插入删除修改的情况

在支持recursive common table expression的关系型数据库中,即使是递归查询也得到了很好的改善,Mysql也在8.0引入了该特性。因此相比于nested set,邻接表应该是首选

closure table

储存节点之间的关系,指明两节点之间的父子关系以及深度

parentchilddepth
121
131
241
142

在closure table中还会指明每个节点都是自己深度为0的父节点,在上表中被省略了

closure table方案在查询树形结构任意层级关系效率都很高,但相比于其他方案占用了更多空间,新增修改也较为麻烦

Ref

  1. https://en.wikipedia.org/wiki/Nested_set_model
  2. https://www.waitingforcode.com/mysql/managing-hierarchical-data-in-mysql-path-enumeration/read
  3. https://fueled.com/the-cache/posts/backend/closure-table/
  4. https://dev.mysql.com/doc/refman/8.0/en/with.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1045185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

matlab实现杨氏双缝干涉实验可视化界面

关于杨氏双缝干涉实验的条纹光强理论推导和matlab绘图可以参考下面的链接:杨氏双缝干涉实验matlab实现 接下来利用GUI实现可视化界面。 一、GUI GUIDE简介 1、在命令行窗口输入小写的guide可以自动弹出fig窗口。 2、界面的左侧是常用的工具,鼠标悬停…

利用串口示波器调试PID参数

PID调试最麻烦的是参数调整,需要花费大量时间,如果每调整一次都要修改代码重新编译烧录,效率很低,推荐串口示波器与rt-thead finsh进行调试 推荐使用FireWater数据引擎 定时上报数据,rt_kprintf不支持浮点数据打印&a…

从零开始之了解电机及其控制(6)六步换向法

引导:六步换向的本质是? 因为无刷电机有三根线,而H桥可以将负载连接到正电压或者地,于是用三对MOS管组成的H桥驱动电机,称为半桥驱动。 无刷电机的优点如下: 首先,由于所有三个电机相位都通过…

xcode15下载ios17模拟器失败

升级到xcode15后需要安装ios17模拟器 但是在下载过程中会遇到报错 如下图这种 网上搜索了一下发现有人遇到过无法下载的问题,并且在apple官网也有人提出类似问题 https://developer.apple.com/forums/thread/737648 解决方案就是从https://developer.apple.com/do…

linux提权秘籍

Linux 提权总结 一、常用基础 1、自定义可执行文件(Custom Executable) 可能有某些根进程执行另一个可以控制的进程。在这些情况下,以下C代码一旦编译,将生成一个作为根运行的sbashell: int main() { setuid(0);system("/bin/bash -p…

MapBox GL JS出现“Unimplemented type: 7”问题的解决办法

Mapbox GL JS在矢量瓦片的渲染方面有独特的优势,可以支持动态的样式,支持字体切片,快速加载各种字体。使用起来十分方便,但是在很长的一段时间内,经常遇到出现大量“Unimplemented type: 7”的控制台错误提示&#xff…

Web自动化测试 —— headless无头浏览器!

一、Options概述 是一个配置浏览器启动的选项类,用于自定义和配置Driver会话常见使用场景: 设置无头模式:不会显示调用浏览器,避免人为干扰的问题。设置调试模式:调试自动化测试代码(浏览器复用) 二、添加启动配置 添…

丰田 Auris 混动车电池冷却系统异常

故障现象 一辆丰田 Auris 混合动力车行驶时,混合动力车警告灯亮起。这辆车被改装成监控用车,车厢内到处都装有敏感的录音设备。 为了不被下面的情况所影响,我们从混合动力控制单元(HCU)中提取了故障代码 P0A82-123。混…

Multisim14.0仿真(二十四)基于LM555定时器的施密特触发器

一、仿真原理图: 二、仿真效果图:

【数据结构——单链表】本篇文章通过图文结合的方式能让你轻松的掌握单链表

链表的概念及结构 有了顺序表为什么还会出现链表呢? 链表和数组类似,但是功能比数组强大的多,数组的空间是固定的,在定义数组的时候空间大小就已经固定了,在使用时有可能会造成空间的浪费或者面临空间不够的风险&…

2023年建筑架子工(建筑特殊工种)证考试题库及建筑架子工(建筑特殊工种)试题解析

题库来源:安全生产模拟考试一点通公众号小程序 2023年建筑架子工(建筑特殊工种)证考试题库及建筑架子工(建筑特殊工种)试题解析是安全生产模拟考试一点通结合(安监局)特种作业人员操作证考试大纲和(质检局)特种设备作…

第九章 内存分区模型

C程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理的 全局区:存放全局变量和静态变量以及常量 栈区:由编译器自动分配释放, 存放函数的参数值,局部变量等 堆区&#xff1…

【NLP的Python库(04/4)】:Flair

一、说明 Flair是一个现代的NLP库。从文本处理到文档语义,支持所有核心 NLP 任务。Flair使用现代转换器神经网络模型来完成多项任务,并结合了其他Python库,可以选择特定的模型。其清晰的API和注释文本的数据结构,以及多语言支持&a…

FPGA project : uart232_ram_vga

重点学习: 本实验重点学习了双口ram解决多bit跨时钟域同步处理的问题。 其实signal port ram,它的输入口和输出口分别用不同的时钟,也可以解决这个问题。 让我意识到的比较重要的事情: 1,代码设计中,一…

VEX —— Functions|Measure

目录 distance —— 返回两点间距离 distance2 —— 返回两点间距离平方 surfacedist —— 查找点到点组的距离(沿几何体表面) xyzdist —— 查找点到表面最近点的距离 uvdist —— 在uv空间查找uv坐标到几何体的距离 planepointdistance —— 计算…

【免费】2023云栖大会门票开抢啦!数量有限,先到先得!

🎫 报名方式:点击链接即可免费报名! 🔗 2023云栖大会-领票页 📅 10月31日-11月2日,让我们齐聚云栖小镇!

基于 Nginx 实现一个灰度发布系统

软件开发一般不会上来就是最终版本,而是会一个版本一个版本的迭代。新版本上线前都会经过测试,但就算这样,也不能保证上线了不出问题。所以,在公司里上线新版本代码一般都是通过灰度系统进行测试。并且,灰度系统可以把流量划分成多份,一份走新版本代码,一份走老版本代码…

数据通信——应用层(文件传输FTP)

引言 域名保证了在因特网中标识唯一的用户,而我们用户上网需求自然是发送信息以及共享文件,我们使用的很多传输工具,比如微信、QQ、百度等软件,在上传和下载文件时就会有FTP的参与。那么如何为文件提供收发渠道以完成的共享呢&…

一篇文章带你了解最近很火的RunnerGo测试平台

在当今这个数字化时代,应用程序的性能至关重要。一款可靠的性能测试工具,能够为企业带来无数的好处。最近,一款名为RunnerGo的开源性能测试工具备受瞩目。本文将详细介绍RunnerGo的特点、优势以及如何解决性能测试中的痛点。 RunnerGo产品介绍…

位运算符与高级操作

位运算符与高级操作 运算符 高级操作 左移实现乘法 左移n位等价于乘以2的n次方 int x; x 2; x x << 2; x x << 3;使用左移实现乘法运算仅限于乘以2的倍数 是不是只要左移就能够实现乘以2的倍数呢? char x 120; x x << 1;右移实现除法 右移n位等价于除…