MySQL基于左右值编码的树形数据库表结构设计

B左边的值为2,其比Hell Mayes的所有子孙节点的值都要小(D[3,4]、E[5,10]、I[6,7]、J[8,9]、F[11,12])B右边的值为13,其比Hell Mayes的所有子孙节点的值都要大(D[3,4]、E[5,10]、I[6,7]、J[8,9]、F[11,12])
CREATE TABLE `tree` (`node_id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(45) DEFAULT NULL,`lft` int(11) DEFAULT NULL,`rgt` int(11) DEFAULT NULL,PRIMARY KEY (`node_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `tree` VALUES(1,'A',1,20),(2,'B',2,13),(3,'C',14,19),(4,'D',3,4),(5,'E',5,10),(6,'F',11,12),(7,'G',15,16),(8,'H',17,18),(9,'I',6,7),(10,'J',8,9);
SELECT* FROM Tree WHERE Lft BETWEEN 2 AND 13 ORDER BY Lft ASC
.jpg)
SELECT COUNT(*) FROM Tree WHERE Lft <= 2 AND Rgt >=13
CREATE DEFINER=`root`@`localhost` FUNCTION `CountLayer`(p_node_id int) RETURNS int(11)BEGINdeclare p_result,p_lft,p_rgt int default 0;if exists (select 1 from tree where node_id=p_node_id) thenbeginselect lft, rgt into p_lft, p_rgt from tree where node_id=p_node_id;select count(*) into p_result from tree where lft <= p_lft and rgt >= p_rgt;end;return p_result;end if;RETURN 0;END
CREATEALGORITHM = UNDEFINEDDEFINER = `root`@`localhost`SQL SECURITY DEFINERVIEW `tree_view` ASSELECT`tree`.`node_id` AS `node_id`,`tree`.`name` AS `name`,`tree`.`lft` AS `lft`,`tree`.`rgt` AS `rgt`,COUNTLAYER(`tree`.`node_id`) AS `layer`FROM`tree`ORDER BY `tree`.`lft`
.jpg)
CREATE DEFINER=`root`@`localhost` PROCEDURE `GetChildrenNodeList`(in p_node_id int)BEGINdeclare p_lft,p_rgt int default 0;if exists (select node_id from tree where node_id=p_node_id) thenbeginselect lft,rgt into p_lft,p_rgt from tree where node_id=p_node_id;select * from Tree_View where lft between p_lft and p_rgt order by layer, lft;end;end if;END
call GetChildrenNodeList(2);
.jpg)
CREATE DEFINER=`root`@`localhost` PROCEDURE `GetParentNodePath`(in p_node_id int)BEGINdeclare p_lft,p_rgt int default 0;if exists (select node_id from tree where node_id=p_node_id) thenbeginselect lft,rgt into p_lft,p_rgt from tree where node_id=p_node_id;select * from Tree_View where lft<p_lft and rgt>p_rgt order by layer,lft asc;end;end if;END
call GetParentNodePath(5);
.jpg)
.jpg)
CREATE DEFINER=`root`@`localhost` PROCEDURE `AddSubNode`(in p_node_id int,in p_node_name varchar(50))BEGINdeclare p_rgt int default 0;if exists(select node_id from tree where node_id=p_node_id) thenbeginSET AUTOCOMMIT=0;START TRANSACTION;select rgt into p_rgt from tree where node_id=p_node_id;update tree set rgt=rgt+2 where rgt>=p_rgt;update tree set lft=lft+2 where lft>=p_rgt;insert into tree(name,lft,rgt) values(p_node_name,p_rgt,p_rgt+1);COMMIT;end;end if;END
call AddSubNode(8,'K');
.jpg)
CREATE DEFINER=`root`@`localhost` PROCEDURE `DelNode`(in p_node_id int)BEGINdeclare p_lft,p_rgt int default 0;if exists(select p_node_id from tree where node_id =p_node_id) thenSTART TRANSACTION;select lft,rgt into p_lft,p_rgt from tree where node_id=p_node_id;delete from tree where lft>=p_lft and rgt<=p_rgt;update tree set lft=lft-(p_rgt - p_lft + 1) where lft > p_lft;update tree set rgt=rgt-(p_rgt - p_lft + 1) where rgt > p_rgt;COMMIT;end if;END
call DelNode(3);
.jpg)
MySQL基于左右值编码的树形数据库表结构设计的更多相关文章
- 树形结构的数据库表Schema设计-基于左右值编码
树形结构的数据库表Schema设计 程序设计过程中,我们常常用树形结构来表征某些数据的关联关系,如企业上下级部门.栏目结构.商品分类等等,通常而言,这些树状结构需要借助于数据库完 成持久化.然而目前的 ...
- 数据库表结构设计方法及原则(li)
数据库设计的三大范式:为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的总结.要想设计一个结构合理的关系型数据库,必须满 ...
- ofbiz数据库表结构设计(3)- 订单ORDER
对于订单来说,主要的表就是ORDER_HEADER和ORDER_ITEM.ORDER_HEADER就是所谓的订单头,一条记录代表一条订单. ORDER_PAYMENT_PREFERENCE是订单的支付 ...
- ofbiz数据库表结构设计(2)- CONTACT_MECH
ofbiz中,party的电话.地址等联系方式设计得非常巧妙,让我们来仔细分析一下. 有一个叫做CONTACT_MECH的表,这张表我们把它称作联系方式表,一个电话号码.一个通讯地址.一个电子邮件,都 ...
- ofbiz数据库表结构设计(1)- PARTY
ofbiz的精华就在于其数据结构(表结构)的设计.数据结构的通用性也决定了ofbiz几乎可以适用任何企业应用.我们首先来看看PARTY相关的表结构设计. 在ofbiz中,PARTY是个抽象概念,它可以 ...
- Activiti5.13数据库表结构设计
1.结构设计 1.1. 逻辑结构设计 Activiti使用到的表都是ACT_开头的. ACT_RE_*: ’RE’表示repository(存储),RepositoryService接口所操作的 ...
- 【VIP视频网站项目三】项目框架搭建、项目路由配置、数据库表结构设计
一.项目路由的设计 目前项目代码已经全部开源:项目地址:https://github.com/xiugangzhang/vip.github.io 视频网站前台页面路由设计 路由 请求方法 模板 作用 ...
- mysql增加远程连接用户及查看数据库表结构
一.增加远程连接用户 1.用root权限登录数据库 2.加用户:grant all privileges on *.* to '111'@'192.168.1.%' identified by '2 ...
- mysql数据库连接状态,不要做修改数据库表结构的操作;数据库迁移操作;
在开发过程中,python的flask框架使用sqlalmysql连接mysql数据库. 在程序连接数据量过程中,不要修改数据表的结构.比如在连接状态中使用下面的软件修改数据表结构,这个软件立即就会卡 ...
随机推荐
- CAD快捷键
F1: 获取帮助 F2: 实现作图窗和文本窗口的切换 F3: 控制是否实现对象自动捕捉 F4:数字化仪控制 F5: 等轴测平面切换 F6: 控制状态行上坐标的显示方式 F7: 栅格显示模式控制 F8: ...
- vue父子组件生命周期执行顺序
之前写了vue的生命周期,本以为明白了vue实例在创建到显示在页面上以及销毁等一系列过程,以及各个生命周期的特点.然而今天被问到父子组件生命周期执行顺序的时候一头雾水,根本不知道怎么回事.然后写了一段 ...
- js分享功能(微信,QQ,微博,空间,豆瓣等)
日常编程中,我们可能会碰到项目中的分享功能,各大平台都有分享接口和文档说明,当然也有一些一键分享插件,例如:sosh,iShare.js等等 但有些同学不想引用插件,那么我整理了一些常用的分享至平台功 ...
- JVM调优的几种策略
一.JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) 永久代(Perm) 其中New和Tenured属于堆内存,堆内存会从J ...
- LOJ #6485 LJJ 学二项式定理
QwQ LOJ #6485 题意 求题面中那个算式 题解 墙上暴利 设$ f(x)=(sx+1)^n$ 假设求出了生成函数$ f$的各项系数显然可以算出答案 因为模$ 4$的缘故只要对于每个余数算出次 ...
- 开发一个项目之css
background属性 5+3 image,color,position,repeat,attachment size: 保持纵横比 contain 再发大就cover了 clip:背景绘制区域 b ...
- C语言通讯录系统——C语言单向链表实现
实现的通讯录功能有:查看通讯录.添加联系人.删除联系人.查询联系人.保存并退出. 通过txt文件保存和读取通讯录数据. #include <stdio.h> #include <st ...
- GraphQL Java Demo代码
mvn 引用GraphQL <dependency> <groupId>com.graphql-java</groupId> <artifactId>g ...
- python使用pip 18以上版本离线安装package
在内网办公环境,常常需要使用离线安装python的软件包. 一般都会先在互联网的电脑上下载,再拷贝到内网办公机器上进行离线安装. 一般来说,我是这样做的: 1.拷贝和外网电脑上版本一致,且32位或64 ...
- python学习第34天
# 互斥锁# 进程之间的数据共享 # 关于数据安全的问题# 进程池(自己了解,后面线程部分还会讲) # from multiprocessing import Pool# 线程的概念 (面试的重点)# ...