闭包表(Closure Table)

设计血缘关系(data-lineage)时,想到要使用的表模型。

表设计 

节点记录表 - node


CREATE TABLE `lineages_node` (`name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '节点名称',`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='节点';

节点关系表 - relation

CREATE TABLE `lineages_relation` (`ancestor` bigint(20) unsigned DEFAULT NULL COMMENT '祖先节点',`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`descendant` bigint(20) unsigned DEFAULT NULL COMMENT '后代节点',`depth` int(10) unsigned DEFAULT NULL COMMENT '相隔层级',PRIMARY KEY (`id`),KEY `lineages_relation_descendant_IDX` (`descendant`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='数据血缘-关系';

祖先 和 后代 数据表中的 约束 和 外键,还有表中其他字段,看自己业务需求

数据结构获取

获取祖先为id 1的节点的关系

SELECT elr.relation, elr.ancestor, elr.descendant FROM lineages_node elnINNER JOIN lineages_relation elr ON eln.id = elr.ancestorINNER JOIN lineages_node n3 ON elr.descendant = n3.idWHERE eln.id = 1

删除id为4的节点

DELETE FROM NodeInfo WHERE node_id = 4;DELETE FROM NodeRelation AS n1WHERE n1.descendant IN (SELECT a.descendant FROM (SELECT n2.descendant FROM NodeRelation AS n2 WHERE n2.ancestor = 4)AS a);

添加节点

CREATE DEFINER = `root`@`localhost` PROCEDURE `AddNode`(`_parent_name` varchar(255),`_node_name` varchar(255))BEGINDECLARE _ancestor INT(10) UNSIGNED;DECLARE _descendant INT(10) UNSIGNED;DECLARE _parent INT(10) UNSIGNED;IF NOT EXISTS(SELECT node_id From NodeInfo WHERE node_name = _node_name)THENINSERT INTO NodeInfo (node_name) VALUES(_node_name);SET _descendant = (SELECT node_id FROM NodeInfo WHERE node_name = _node_name);INSERT INTO NodeRelation (ancestor,descendant,distance) VALUES(_descendant,_descendant,0);IF EXISTS (SELECT node_id FROM NodeInfo WHERE node_name = _parent_name)THENSET _parent = (SELECT node_id FROM NodeInfo WHERE node_name = _parent_name);INSERT INTO NodeRelation (ancestor,descendant,distance) SELECT ancestor,_descendant,distance+1 FROM NodeRelation WHERE descendant = _parent;END IF;END IF;END;
<?phpfunction addNode($nodeEntity, $parentNodeEntity) {if (LineagesNode::getQuery()->where([['id', '=', $nodeEntity->id]])->exists()) {if (!empty($parentNodeEntity)) {/** @var LineagesNode $node */$node = LineagesNode::getQuery()->where([['id', '=', $nodeEntity->id]])->first();$nodeId = $node->id;// all descendants update$descendants = LineagesRelation::getQuery()->where([['ancestor', '=', $nodeId]])->get();// add new ancestor to descendantsforeach ($descendants as $descendant) {$insertBranches[] = ['ancestor' => $parentNodeEntity->id,'descendant' => $descendant->descendant,'depth' => $descendant->depth + 1,];}}return true;} else {// create node and get new node id$nodeId = LineagesNode::getQuery()->insertGetId(['name' => $nodeEntity->name]);// relationship$result = LineagesRelation::getQuery()->insert(['ancestor' => $nodeId,'descendant' => $nodeId,'depth' => 0]);if (!empty($parentNodeEntity)) {// all ancestors from parent node$ancestors = LineagesRelation::getQuery()->where([['descendant', '=', $parentNodeEntity->id], ['deleted_at', '=', null]])->get();LineagesRelation::getQuery()->insert(['ancestor' => $parentNodeEntity->id,'descendant' => $nodeId,'depth' => 1]);LineagesRelation::getQuery()->insert(['ancestor' => $parentNodeEntity->id,'descendant' => $nodeId,'depth' => 1]);foreach ($ancestors as $ancestor) {$insertBranches[] = ['ancestor' => $ancestor->id,'descendant' => $nodeId,'depth' => $ancestor->depth + 1];}}// updateif (!empty($insertBranches)) {return LineagesRelation::getQuery()->insert($insertBranches);}return $result;}
}

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

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

相关文章

element--el-table合计换行显示

el-table合计换行显示 效果图实现1、使用到的参数2、代码演示 效果图 实现 1、使用到的参数 官网链接&#xff1a;element-table 将show-summary设置为true就会在表格尾部展示合计行。默认情况下&#xff0c;对于合计行&#xff0c;第一列不进行数据求合操作&#xff0c;而是…

【Python/Pytorch - 网络模型】-- SVD算法

文章目录 文章目录 00 写在前面01 基于Pytorch版本的SVD算代码02 理论知识 00 写在前面 &#xff08;1&#xff09;矩阵的奇异值分解在最优化问题、特征值问题、最小二乘方问题、广义逆矩阵问题及统计学等方面都有重要应用&#xff1b; &#xff08;2&#xff09;应用&#…

Sora和快手可灵背后的核心技术 | 3DVAE:通过小批量特征交换实现身体和面部的三维形状变分自动编码器

【摘要】学习3D脸部和身体生成模型中一个解开的、可解释的和结构化的潜在表示仍然是一个开放的问题。当需要控制身份特征时,这个问题尤其突出。在本文中,论文提出了一种直观而有效的自监督方法来训练一个3D形状变分自动编码器(VAE),以鼓励身份特征的解开潜在表示。通过交换不同…

Docker配置与使用详解

一、引言 随着云计算和微服务的兴起&#xff0c;Docker作为一种轻量级的容器化技术&#xff0c;越来越受到开发者和运维人员的青睐。Docker通过容器化的方式&#xff0c;将应用程序及其依赖项打包成一个可移植的镜像&#xff0c;从而实现了应用程序的快速部署和扩展。本文将详…

数据结构(DS)C语言版:学习笔记(4):线性表

参考教材&#xff1a;数据结构C语言版&#xff08;严蔚敏&#xff0c;吴伟民编著&#xff09; 工具&#xff1a;XMind、幕布、公式编译器 正在备考&#xff0c;结合自身空闲时间&#xff0c;不定时更新&#xff0c;会在里面加入一些真题帮助理解数据结构 目录 2.1线性…

DP读书:半导体物理考试重点

半导体物理重点&#x1f973;&#x1f973;&#x1f973; 半导体中电子的状态和能带 半导体的单晶材料和其他固态晶体材料一样&#xff0c;是由大量原子周期性重复排列而成&#xff0c;而每个原子又包含原子核和许多电子。 半导体单晶材料中的带电子是指&#xff1a;半导体晶…

vue页面带滚动条,打开新页面页面不置顶的问题

第一个思路还是找router下的index.jsexport default new Router({mode: history, // 去掉url中的#scrollBehavior: () > ({ y: 0 }),routes: constantRoutes })如果不成功可以再试试在内容区设置document.body.scrollTop 设置为0如果有默认class名&#xff0c;通过路由监听修…

PHP入门教程3:数组和字符串操作

PHP入门教程3&#xff1a;数组和字符串操作 在前两篇文章中&#xff0c;我们学习了PHP的基础语法、控制结构和函数的使用。本文将重点介绍数组和字符串的高级操作&#xff0c;这些是PHP编程中非常常见且重要的内容。本文将包含以下几个部分&#xff1a; 数组的类型和操作多维…

C# 泛型分析

1、object类型是一切类型的父类。 2、通过继承&#xff0c;子类拥有父类的一切属性和行为&#xff0c;任何父类出现的地方&#xff0c;都可以用子类来代替。 但是上面object类型的方法又会带来另外一个问题&#xff1a;装箱和拆箱&#xff0c;会损耗程序的性能。 在泛型类型…

在CDH中重启YARN组件时,JobHistoryServer服务启动失败

问题描述 在CDH中重启YARN组件的JobHistoryServerJobHistoryServer服务时&#xff0c;遇到如下错误。 错误一&#xff1a; Stopping JobHistory 上午10点44:40.553分 INFO AbstractService Service org.apache.hadoop.mapreduce.v2.hs.JobHistoryServer failed in state INI…

eNSP由于Cloud网卡设置错误引起的STP环路机制问题

现象&#xff1a;SW1和SW2之间直连&#xff08;vlan13&#xff09;不可达&#xff0c;但是断开左边的Cloud云的虚拟之后可达&#xff08;设置g0/0/1口为down) ,接口协议均up&#xff0c;配置正确。 查看生成树状态&#xff1a; 发现&#xff0c;SW2的g0/0/4接口为阻塞状态&…

[机器学习] Stable Diffusion初体验——基于深度学习通过神经网络的强大AI平台

文章目录 前言平台介绍 一.创建应用 Stable Diffusion WebUI初始化上传模型&#xff0c;VAE&#xff0c;lora 介绍sd模型&#xff0c;vae&#xff0c;lora模型进入应用文生图工作区调参区图生图 结语 前言 在这个信息爆炸的时代&#xff0c;AI技术正以前所未有的速度发展着。图…

微服务开发与实战Day07 - MQ高级篇

一、消息可靠性问题 首先&#xff0c;分析一下消息丢失的可能性有哪些。 消息从发送者发送消息&#xff0c;到消费者处理消息&#xff0c;需要经过的流程是这样的&#xff1a; 消息从生产者到消费者的每一步都可能导致消息丢失&#xff1a; 发送消息时丢失&#xff1a; 生产…

2024.6.17 刷题总结

2024.6.17 **每日一题** 522.最长特殊序列 Ⅱ&#xff0c;本题为前者的升级版&#xff0c;从两个字符串变成一个字符串序列了&#xff0c;所以我们需要依次枚举字符串来进行判断。先写一个判断两字符串是否相等的函数&#xff0c;然后枚举字符串逐个判断是否相等&#xff0c;若…

逆风破浪之中国半导体产业迈向全球舞台的坚实步伐

在科技飞速发展的今天&#xff0c;芯片技术已成为推动现代科技进步的核心动力。在这个全球芯片市场的激烈竞争中&#xff0c;中国作为“后来者”&#xff0c;不仅没有被淘汰&#xff0c;反而凭借惊人的发展潜力和创新能力&#xff0c;逐步崭露头角&#xff0c;成为全球芯片行业…

引调水设计乙级资质中技术负责人安排哪个专业?

引调水设计乙级资质中的技术负责人一般应具备与水利工程特别是引调水工程相关的专业背景。技术负责人通常需要满足以下条件&#xff1a; 大专以上学历&#xff1b;至少10年的设计工作经验&#xff1b;具有中级以上专业技术职称&#xff1b;在引调水工程方面具有至少2项项目设计…

Leetcode275 H指数II

题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以…

第二证券:新股“肉签”不断,今日两只申购!光伏巨头小伙伴来了

本周&#xff08;6月17日—6月21日&#xff09;&#xff0c;A股商场将迎来两只新股&#xff0c;分别为沪市主板的永臻股份和创业板的爱迪特&#xff0c;均将于本周一进行申购。 资料显现&#xff0c;永臻股份是国内领先的铝合金光伏结构件制造商&#xff0c;公司发行价为23.35…

俄罗斯方块小游戏(附源码)

游戏展示 一.导包 import turtle import random 二.定义一个Block类 定义一个Block类&#xff0c;用于表示游戏中的方块&#xff0c;包含颜色和形状。 class Block:def __init__(self, color, tiles):self.color colorself.tiles tiles三.定义了7个不同的Block对象 定义了7…

docker通过容器id查看运行命令;Portainer监控管理docker容器

1、docker通过容器id查看运行命令 参考&#xff1a;https://blog.csdn.net/a772304419/article/details/138732138 docker inspect 运行镜像id“Cmd”: [ “–model”, “/qwen-7b”, “–port”, “10860”, “–max-model-len”, “4096”, “–trust-remote-code”, “–t…