理解树形结构数据的操作(上)

news/2024/9/19 4:09:28 标签: sql, 数据库

树形结构数据 

        在Web开发中经常遇到树形数据的操作,如菜单、组织机构、行政区(省、市、县)等具有层级关系的数据。在数据结构和数据库设计中,处理树形结构数据时,有几种常见的方法,包括邻接表、嵌套集(Nested Set)、左右值编码(Left-Right Encoding)和全路径(Full Path)等。这些方法各有特点,适用于不同的应用场景。

  1. 邻接表(Adjacency List)‌:

            邻接表是一种图的数据结构,用于表示图中顶点之间的关系。在树形结构的表示中,邻接表可以清晰地展示节点之间的父子关系。每个节点都有一个列表,存储它的直接子节点的信息。这种方法实现简单,易于理解和操作,但在进行树的相关操作时可能效率较低,因为需要频繁地进行递归查询‌。
  2. 嵌套集(Nested Set)‌:

            嵌套集通过为每个节点分配两个数字(左值和右值),这两个数字定义了一个节点在其父节点下的位置。这种方法通过维护一个有序的节点序列,使得查询子节点、祖先节点等操作变得非常高效,因为可以直接通过数字比较来完成。但是,嵌套集的更新操作相对复杂,因为每次节点的移动都会影响多个节点的左值和右值‌。
  3. 左右值编码(Left-Right Encoding)‌:

            左右值编码为每个节点增加左右值,这些值通过前序遍历算法分配,形成了一个有序的节点序列。这种方法同样使得查询子节点、祖先节点等操作高效,并且避免了递归查询的效率问题。但是,更新操作同样复杂,因为需要调整多个节点的左右值‌。
  4. 全路径(Full Path)‌:

            全路径方法将节点的完整路径存储在每个节点中,这样可以直接通过路径找到任何节点,无需进行复杂的查询操作。这种方法在处理某些特定问题时非常有效,但存储每个节点的完整路径可能会占用较多的存储空间,并且在大型树中维护路径的更新可能会变得复杂和低效‌。

1.邻接表

1.1. 实现方式

  • 每个记录增加一个 parent_id; [id, parent_id]
idnameparent_id
1华府
2华太师1
3华夫人1

1.2. 优点/缺点

  • 查询所有子节点:需要递归
  • 树形形遍历:需要递归
  • 插入:简单
  • 删除:需要递归删除
  • 移动:简单
  • 冗余:无
  • 是否有层级限制:无 

2.嵌套表(闭包表)

2.1. 实现方式:

1.主表:[id, parent_id]

idnameparent_id
1华府
2华太师1
3华夫人1
4武状元2
5管家2
6华安5

2.嵌套子表:[id, food_id, parent_id]

idparent_idfoot_id
112
213
314
415
516
624
725
826
956

2.2. 优点/缺点

  • 查询所有子节点:简单,需要关联表
  • 树形形遍历:需要递归
  • 新增:一般,需要更新嵌套表
  • 删除:一般,需要更新嵌套表
  • 移动:一般,需要更新嵌套表
  • 冗余:数据冗余,需要额外的存储空间(Cn2:C(n,2)),随着层级的增加,所需空间迅速增加
  • 是否有层级限制:无

        具体说明:

        优点:

  • 查询、删除一个表下所有子节点方便,select foot_id from table_name where parent_id = x;

        缺点: 

  • 需要额外的存储空间(Cn2:C(n,2)),随着层级的增加,所需空间也增加。
  • 新增、删除需要额外的维护关系的成本。


http://www.niftyadmin.cn/n/5664950.html

相关文章

Spring Boot-静态资源管理问题

在Spring Boot中,静态资源管理是构建现代Web应用程序时必不可少的一部分。无论是处理静态页面、图片、CSS、JavaScript文件,还是一些自定义文件,正确管理这些资源能够提升用户体验和优化应用的性能。 1. Spring Boot中的静态资源管理概述 S…

执行测试_单元测试

在执行测试为主线,中间穿插质量特性,学会自动化工具的使用。 软件测试的过程 测试范围:逐渐增大:先使用白盒测试,然后黑盒测试的比例逐步增加。测试视角:从代码到使用 具体来说就是: 单元测试—…

②MODBUS TCP 转 RS485(RS485与TCP数据双向互传)MODBUS TCP与MODBUS RTU互转(无需编程 独立通道)

型号:1路总线TCP网关(单网口) MS-A1-5011 1路总线TCP网关(双网口) MS-A2-5011 2路总线TCP网关(单网口) MS-A1-5021 2路总线TCP网关(双网口) MS-A2-5021 4路总…

java的内存模型和线程调度

硬件的效率与一致性 计算机同时处理多个任务,一方面是因为计算机的运算能力强大,另一方面,也有计算机运算速度和它存储与通信子系统是速度差距太大的原因,很多时间浪费在了IO读取,网络通信等任务上,如果无…

保护您的企业免受网络犯罪分子侵害的四个技巧

在这个日益数字化的时代,小型企业越来越容易受到网络犯罪的威胁。网络犯罪分子不断调整策略,并使用人工智能来推动攻击。随着技术的进步,您的敏感数据面临的风险也在增加。 风险的不断增大意味着,做好基本工作比以往任何时候都更…

linux入门到实操-6 Linux服务管理、系统运行级别、配置服务开机启动和关闭防火墙、关机重启

教程来源:B站视频BV1WY4y1H7d3 3天搞定Linux,1天搞定Shell,清华学神带你通关_哔哩哔哩_bilibili 整理汇总的课程内容笔记和课程资料(包含课程同版本linux系统文件等内容),供大家学习交流下载:…

MacOS安装MAT教程

MAT下载地址MAT下载地址MAT下载地址MAT下载地址 如果不知道你的芯片类型, 可以执行如下命令 uname -m

MySQL系列—11.Redo log

1.简介 概念 redo log用于记录事务操作变化,记录的是数据被修改之后的值,(tbs space id page no action)。 作用 尚未完成的DML,数据库崩溃则用log恢复。保证事务持久性。 ( 1 ) 在页面修改完成之后,脏页刷入磁盘之…