探究MySQL中的“树”结构

news2024/11/15 13:29:54

1 引言

树高千丈,叶落求索 – 唐代杜牧

树结构在MySQL中常用于表示层次关系,如组织结构或分类体系。引入树结构可使数据之间建立父子关系,便于查询和管理。益处包括快速检索子节点、方便展示层次关系、支持递归查询等。

2 基础概念

2.1 名词解析

程序就像是一张有向图,你需要跟着边走才能找到正确的路径。

  • 节点(Node):图中的基本元素,通常用来表示实体或对象。在计算机科学中,节点可以是任何数据结构中的元素,如树中的节点或图中的顶点。
  • 边(Edge):节点之间的连接关系,用来表示节点之间的关联或连接。在图论中,边可以是有向的(箭头表示方向)或无向的(双向连接)。
  • 路径(Paths):在图论中,路径是图中节点的序列,其中相邻节点通过边相连。路径可以是简单路径(不经过重复节点)或环路(起点和终点相同的路径)。
  • 循环(Cycles):循环是图中形成闭合回路的路径,即起点和终点相同的路径。循环可以是简单循环(不经过重复节点,除起点和终点外)或包含重复节点的循环。
  • 稀疏度(Sparsity):是指图中边的数量与可能存在的最大边数之间的比率。在稀疏图中,边的数量相对较少,而在稠密图中,边的数量相对较多。这个概念通常用于描述图的结构和连接性。
  • 图遍历(Traversing graphs): 图遍历是一种算法,用于访问图中的所有节点或特定节点,以便对图进行分析或搜索。常见的图遍历算法包括深度优先搜索(DFS)和广度优先搜索(BFS)。DFS沿着图的深度遍历节点,而BFS则逐层遍历节点。这些算法在解决许多图相关问题时非常有用,如寻找路径、检测环路、拓扑排序等。
  • 树(Trees):树是一种层次性的数据结构,由节点(顶点)和边组成,其中每个节点最多有一个父节点,但可以有多个子节点。树的一个节点称为根节点,它没有父节点。树中除了根节点外,每个节点都有且仅有一个父节点。树的节点之间通过边连接,形成层次结构,从根节点到任意节点都有唯一的路径。树常用于表示层次关系,如组织结构、文件系统等。树的一些重要概念包括深度(节点到根节点的距离)、高度(树的最大深度)、叶节点(没有子节点的节点)等。树还有许多变种,如二叉树(每个节点最多有两个子节点)、二叉搜索树(左子节点小于父节点,右子节点大于父节点)等,它们在不同场景下有不同的应用和特性。
  • 欧拉路径(Euler Paths):欧拉路径是指在图论中,经过图中每条边恰好一次的路径。如果一个图包含欧拉路径,则称该图具有欧拉路径性质。欧拉路径可以从一个节点出发,经过每条边一次且仅一次,最终回到另一个节点,或者以某个节点结束而不回到起点。欧拉路径在解决一些图相关问题时非常有用,如在网络中找到一条包含所有边的路径,或者在游戏中找到一条经过所有关键点的路径。欧拉路径的存在性和性质受到图的结构和边的连接方式的影响,因此对于不同类型的图,欧拉路径的判断和寻找方法也会有所不同。

2.2 图的模型设计

在计算机传统上,表达图的结构关系可以使用边缘列表、邻接表或邻接矩阵其中之一来体现。

边缘列表

  • 概念:边缘列表是一种简单的图表示方法,其中每条边都列为一对顶点。
  • 优点:
    易于实现和理解。
    对于边较少的稀疏图效率高。
  • 缺点:
    对于边较多的稠密图效率低。
    查找与顶点相邻的所有边可能较慢。

邻接表

  • 概念:邻接表是一种数据结构,用于表示图,其中每个顶点维护其相邻顶点的列表。
  • 优点:
    对于边较少的稀疏图效率高。
    对于稀疏图,比邻接矩阵占用更少内存。
  • 缺点:
    对于某些操作,如检查两个顶点之间是否有边,速度较慢。
    对于边较多的稠密图,需要更多内存。

邻接矩阵

  • 概念:邻接矩阵是一个二维数组,其中两个顶点之间存在边的情况用1表示。
  • 优点:
    对于边较多的稠密图效率高。
    允许快速查找边。
  • 缺点:
    对于边较少的稀疏图效率低。
    对于稀疏图,比邻接表占用更多内存。

3 基础模型

3.1 图内容

在这里插入图片描述

3.2 表结构和数据

创建表结构并且初始化数据:

CREATE TABLE nodes ( 
nodeID CHAR ( 1 ) PRIMARY KEY 
);

CREATE TABLE edges(
 childID CHAR(1) NOT NULL,
 parentID CHAR(1) NOT NULL,
 PRIMARY KEY(childID, parentID)
);

INSERT INTO nodes VALUES ('A'), ('B'), ('C'), ('D'), ('E'), ('F');
INSERT INTO edges VALUES ('A','C'), ('C','D'), ('C','F'),('B','E');

查询数据:

SELECT * FROM edges;

在这里插入图片描述

3.3 宽度优先搜索

3.3.1 编写存储过程

定义存储过程,如下:

DROP  PROCEDURE  IF  EXISTS ListReached;
DELIMITER go
CREATE PROCEDURE ListReached (IN root CHAR(1))
BEGIN
  DECLARE rows1  SMALLINT  DEFAULT  0;
  DROP TABLE  IF EXISTS reached;
	CREATE TABLE  reached (
     nodeID  CHAR(1) PRIMARY KEY
  ) ENGINE= HEAP;
	
 INSERT INTO reached VALUES ( root );
 
 SET rows1 = ROW_COUNT();
 WHILE rows1 > 0 DO
    INSERT IGNORE INTO reached  
       SELECT DISTINCT  childID FROM edges AS e 
     INNER JOIN reached AS p ON  e.parentID = p.nodeID;
     
   SET rows1 = ROW_COUNT();
   INSERT IGNORE INTO reached  
       SELECT DISTINCT  parentID FROM edges AS e 
     INNER JOIN reached AS p ON  e.childID = p.nodeID; 
   
   SET rows1 = rows1 +  ROW_COUNT();
  END WHILE;
 
 SELECT *  FROM reached;
 DROP TABLE reached; 

END;
go 

DELIMITER;

调用存储过程:

call  ListReached( 'A');

在这里插入图片描述

3.3.2 使用CTEs

从A 开始搜索:

WITH RECURSIVE cte AS (
	SELECT
		childID,
		parentID,
		1 AS LEVEL
	FROM
		edges
	WHERE
		childId = 'A' UNION ALL
	SELECT
		t.childID,
		t.parentID,
		c.LEVEL + 1
	FROM
		edges t
	

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

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

相关文章

全能大模型AIGC产品的体验与未来展望

目录 前言1 使用体验分享1.1 字节豆包1.2 百度文心一言1.3 阿里通义千问1.4 腾讯元宝 2 大模型产品的对比与选择2.1 产品功能对比2.2 使用成本与便捷性2.3 安全性与隐私保护 3 大模型产品的未来发展方向3.1 技术创新3.2 可持续与可拓展性3.3 用户体验3.4 应用场景 结语 前言 随…

vue 如何制作一个跟随窗口大小变化而变化的组件

vue 如何制作一个跟随窗口大小变化而变化的组件 像下图中展示的那些统计数件就是跟随窗口变化而变化的,而且是几乎等比缩放的。 实现原理 只简略说一下原理。 pinia 中记录一个窗口变化的高度值给要变化的组件添加一个高度值组件内部所有关于长度距离的值都通过这…

利用同时预测节点和边的图神经网络 实现鲁棒的椎骨识别

文章目录 Robust Vertebra Identification Using Simultaneous Node and Edge Predicting Graph Neural Networks摘要方法实验结果 Robust Vertebra Identification Using Simultaneous Node and Edge Predicting Graph Neural Networks 摘要 该论文指出,在CT扫描中自动定位和…

神经网络 torch.nn---Convolution Layers

torch.nn — PyTorch 2.3 documentation torch.nn - PyTorch中文文档 (pytorch-cn.readthedocs.io) torch.nn和torch.nn.functional的区别 torch.nn是对torch.nn.functional的一个封装,让使用torch.nn.functional里面的包的时候更加方便 torch.nn包含了torch.nn.…

使用API有效率地管理Dynadot域名,删除已设置的文件夹

关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…

几种更新 npm 项目依赖的实用方法

几种更新 npm 项目依赖的实用方法 引言1. 使用 npm update 命令2. 使用 npm-check-updates 工具3. 使用 npm outdated 命令4. 直接手动更新 package.json 文件5. 直接安装最新版本6. 使用自动化工具结语 引言 在软件开发的过程中,我们知道依赖管理是其中一个至关重…

Linux基础指令磁盘管理002

LVM(Logical Volume Manager)是Linux系统中一种灵活的磁盘管理和存储解决方案,它允许用户在物理卷(Physical Volumes, PV)上创建卷组(Volume Groups, VG),然后在卷组上创建逻辑卷&am…

【Unity性能优化】使用多边形碰撞器网格太多,性能消耗太大了怎么办

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 专栏交流🧧&…

【多模态】35、TinyLLaVA | 3.1B 的 LMM 模型就可以实现 7B LMM 模型的效果

文章目录 一、背景二、方法2.1 模型结构2.2 训练 pipeline 三、模型设置3.1 模型结构3.2 训练数据3.3 训练策略3.4 评测 benchmark 四、效果 论文:TinyLLaVA: A Framework of Small-scale Large Multimodal Models 代码:https://github.com/TinyLLaVA/T…

Stable Diffusion——四种模型 LoRA(包括LyCORIS)、Embeddings、Dreambooth、Hypernetwork

目前 Stable diffusion 中用到主要有四种模型,分别是 Textual Inversion (TI)以 Embeddings 为训练结果的模型、Hypernetwork 超网络模型、LoRA(包括 LoRA 的变体 LyCORIS)模型、Dreambooth 模型。 视频博主 koiboi 用…

儿童护眼灯哪个好?带你了解适合儿童的护眼灯款式分享

儿童护眼灯哪个好?作为我们日常生活中极为实用的小家电,为了确保使用台灯时的舒适性并且保护视力,选择一款专业的护眼台灯成为了一个明智的决定。这样的台灯能够提供更舒适、均匀的照明环境,那么到底儿童护眼灯哪个好你&#xff1…

LeetCode刷题之HOT100之不同路径

2024/6/6 小雨,没停。明天就要高考啦,回想五年前我也带着紧张与期待走过这些天,祝高考学子一切顺利。Anyway,早上一到实验室我就去看望我的栀子花,带着满怀的期待去看它长大了多少,是的,花苞还在…

umijs 服务端渲染(SSR) 指南

umijs 服务端渲染(SSR) 指南 Umi 是什么? Umi,中文可发音为乌米,是可扩展的企业级前端应用框架。Umi 以路由为基础的,同时支持配置式路由和约定式路由,保证路由的功能完备,并以此进…

科普!终于把手机副卡给搞清楚了!

你知道什么是手机副卡吗? 你开通过手机副卡吗? 小小的脑袋,大大的疑问? 可能很多朋友对手机副卡这个词比较懵,那不要紧,接下来小编给大家介绍的这是关于手机副卡。 ​ 十个问题,带你搞清楚什…

专用于恢复iOS系统的数据恢复软件

一、简介 1、一款专门为苹果iOS设备设计的数据恢复软件,支持iPhone、iPad和iPod Touch等设备的数据恢复。这款软件能够恢复包括微信聊天记录、通讯录、短信、备忘录等多种类型的数据。用户可以通过设备扫描恢复、iTunes备份恢复和iCloud备份恢复三种模式来进行数据恢…

【MySQL数据库】MySQL 高可用搭建方案——MHA实战

MHA(Master High Availability) MHA实战 MHA(Master High Availability) 一、MHA简介二、MHA搭建准备要求:mha集群搭建,4台服务器,1主2从,1台mha2.1实验思路2.2实验准备 三、搭建MyS…

Python代码关系图生成,帮助快速熟悉一个项目

一、静态代码关系图 工具1、pyreverse pyreverse 是一个由 Logilab 开发的 Python 工具,它能够自动生成 UML (统一建模语言) 类图,这些类图基于 Python 源代码。pyreverse 可以分析 Python 代码,并从中提取出类、模块、函数、方法和它们之间…

如何通过Python SMTP配置示例发附件邮件?

Python SMTP配置的步骤?SMTP服务器的优缺点有哪些? 当我们需要发送包含附件的邮件时,自动化的解决方案显得尤为重要。Python提供了SMTP库,使我们能够轻松配置并发送带有附件的邮件。AokSend将通过一个示例来展示如何操作&#xf…

大坝监测新规范的改进与实施

近年来,为了进一步保障大坝的安全运行,相关部门对大坝监测规范进行了多项改进。本文将详细介绍这些改进措施及其重要性。 1、巡视检查的部位由原来的7个增加到8个,新增了对监测设施的巡查。这一改动确保了监测设施的正常运行,能够…

CR80通用清洁卡:证卡打印机、ATM机、POS机、读卡器等卡片设备清洁维护的好助手!

随着科技的进步,ATM机、POS终端、门禁系统、证卡打印机、读卡器等卡片设备在我们的日常生活中扮演着越来越重要的角色,些设备在长时间使用和环境因素的影响下,容易积聚油脂、灰尘和其他污染物,从而对其性能和功能产生负面影响。 深…