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数据库. 在程序连接数据量过程中,不要修改数据表的结构.比如在连接状态中使用下面的软件修改数据表结构,这个软件立即就会卡 ...
随机推荐
- 关于MarkDown里的图片问题
网上看了很多人为了得到那串URL,需要弄什么python,还有自己弄个服务器. 在我看来这些都是多此一举,只要有个GitHub,然后再开两个页面,一个页面写readme,另一个写issue(不是真的写 ...
- GraphQL Java Demo代码
mvn 引用GraphQL <dependency> <groupId>com.graphql-java</groupId> <artifactId>g ...
- 我们来说说self.setinterval
学了js的你,肯定知道setInterval方法是按照指定的周期(以毫秒计)来调用函数或计算表达,setInterval方法会不停地调用函数,直到clearInterval被调用或窗口被关闭,这个se ...
- python input()键盘输入8583报文带有\x单反斜杠自动转义问题解决办法
用input()输入的字符串是8385报文比如:\x30\x30\x30\x30...,但是输入后,代码把8583报文字符串中多加了一个\,类似\\x30. 但是我把input()代码注释掉,把858 ...
- 项目Alpha冲刺(团队)-第五天冲刺
格式描述 课程名称:软件工程1916|W(福州大学) 作业要求:项目Alpha冲刺(团队)-代码规范.冲刺任务与计划 团队名称:为了交项目干杯 作业目标:描述第五天冲刺的项目进展.问题困难.心得体会 ...
- Idea 使用小技巧【取消自动打开项目】
受到我沈誉大大的启发,把每次的项目自动启动上次的项目给关掉,其实不管掉也行,既然这样,那还是关掉吧. ctrl + alt + s 输入 system Settings 然后把Reopen last ...
- Tensorflow笔记一
Tensorlfow中的计算是通过一个有向图directed graph或则计算图computation graph来实现的. 将每一个运算操作operation作为一个节点node,节点之间通过边e ...
- 微软推 Azure 机器学习工具:Algorithm Cheat Sheet
微软推 Azure 机器学习工具:Algorithm Cheat Sheet [日期:2015-05-15] 来源:CSDN 作者:Linux [字体:大 中 小] Azure Machine ...
- 初识C语言(五)
自定义函数 C语言提供了大量的库函数(右侧资料下载中有),比如stdio.h提供输出函数,但是还是满足不了我们开发中的一些逻辑,所以这个时候需要自己定义函数,自定义函数的一般形式: 注意: 1.[]包 ...
- web---资源的下载及中文乱码问题
1.html网页,超链接交由Servlet处理 <!DOCTYPE html> <html lang="en"> <head> <meta ...