闭包表(Closure Table)

2024-06-17 15:28
文章标签 table closure 闭包表

本文主要是介绍闭包表(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;}
}

这篇关于闭包表(Closure Table)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1069817

相关文章

vue2实践:el-table实现由用户自己控制行数的动态表格

需求 项目中需要提供一个动态表单,如图: 当我点击添加时,便添加一行;点击右边的删除时,便删除这一行。 至少要有一行数据,但是没有上限。 思路 这种每一行的数据固定,但是不定行数的,很容易想到使用el-table来实现,它可以循环读取:data所绑定的数组,来生成行数据,不同的是: 1、table里面的每一个cell,需要放置一个input来支持用户编辑。 2、最后一列放置两个b

通过Ajax请求后台数据,返回JSONArray(JsonObject),页面(Jquery)以table的形式展示

点击“会商人员情况表”,弹出层,显示一个表格,如下图: 利用Ajax和Jquery和JSONArray和JsonObject来实现: 代码如下: 在hspersons.html中: <!DOCTYPE html><html><head><meta charset="UTF-8"><title>会商人员情况表</title><script type="text/javasc

UVa 10820 Send a Table (Farey数列欧拉函数求和)

这里先说一下欧拉函数的求法 先说一下筛选素数的方法 void Get_Prime(){ /*筛选素数法*/for(int i = 0; i < N; i++) vis[i] = 1;vis[0] = vis[1] = 0;for(int i = 2; i * i < N; i++)if(vis[i]){for(int j = i * i; j < N; j += i)vis[j] =

css-table

设置table的文字不换行:给th,td添加white-space: nowrap; 设置单元格内容及其边框的距离:使用html的cellpadding属性,还有一种方式设置padding。在CSS中,table, th, td{padding:0;}效果等同于cellpadding="0″。 设置table的单元格边距:border-spacing如果定义一个 length 参数,那么定义的是水

react antd table expandable defaultExpandAllRows 不生效问题

原因:defaultExpandAllRows只会在第一次渲染时触发 解决方案:渲染前判断table 的datasource 数据是否已准备好 {pageList.length > 0 ? (<TablerowSelection={rowSelection}columns={columns}dataSource={pageList}style={{ marginTop: 24 }}pagina

el-table 封装表格(完整代码-实时更新)

最新更新时间: 2024年9月6号 1. 添加行内编辑、表头搜索 <template><!-- 简单表格、多层表头、页码、没有合并列行 --><div class="maintenPublictable"element-loading-background="rgba(255,255,255,0.5)"><!--cell-style 改变某一列行的背景色 --><!-- tree-props

@vueup/vue-quill使用quill-better-table报moduleClass is not a constructor

quill官方中文文档:https://www.kancloud.cn/liuwave/quill/1434144 扩展表格的使用 注意:想要使用表格 quill的版本要是2.0以后 升级到这个版本后 其他一些插件就注册不了了。 安装: npm install quill@latest   版本需要大于2.0版本 npm install quill-better-table 引入&

【0323】Postgres内核之 hash table sequentially search(seq_scan_tables、num_seq_scans)

0. seq scan tracking 我们在这里跟踪活跃的 hash_seq_search() 扫描。 需要这种机制是因为如果扫描正在进行时发生桶分裂(bucket split),它可能会访问两次相同的条目,甚至完全错过某些条目(如果它正在访问同一个分裂的桶中的条目)。因此,如果正在向表中插入数据,我们希望抑制桶分裂。 在当前的使用中,这种情况非常罕见,因此只需将分裂推迟到下一次插入即可。

table跨行跨列,字体大小

table跨行跨列,字体大小 <table width="100%"> <tr>         <td style="vertical-align:top"><font size="7">某某</font></td>         <td style="vertical-align:top" colspan="2" align="right"><font size="5">求职意向:W

Apache-Flink深度解析-Temporal-Table-JOIN

在《JOIN LATERAL》中提到了Temporal Table JOIN,本篇就向大家详细介绍什么是Temporal Table JOIN。在ANSI-SQL 2011 中提出了Temporal 的概念,Oracle,SQLServer,DB2等大的数据库厂商也先后实现了这个标准。Temporal Table记录了历史上任何时间点所有的数据改动,Temporal Table的工作流程如下: