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数据库. 在程序连接数据量过程中,不要修改数据表的结构.比如在连接状态中使用下面的软件修改数据表结构,这个软件立即就会卡 ...
随机推荐
- python中opencv的安装
1.得到opencv的安装包: 2.把安装包中的cv.py, cv2.pd放到一个文件夹中,并把这个文件夹放到D:\Anaconda2\Lib\site-packages中: 3.添加新的变量,变量名 ...
- Laravel框架中打印sql
在使用Laravel框架的时候,调试的时候,需要将查询的SQL输出校验,这是需要将SQL打印出来. 一.方法 DB::connection()->enableQueryLog(); // 开 ...
- 前端笔记知识点整合之JavaScript(四)关于函数、作用域、闭包那点事
一.自定义函数function 函数就是功能.方法的封装.函数能够帮我们封装一段程序代码,这一段代码会具备某一项功能,函数在执行时,封装的这一段代码都会执行一次,实现某种功能.而且,函数可以多次调用. ...
- Mark SDL2 Lazy Foo's Producations
重点 初学SDL2,此处为笔记.有错误还请指出. 13)When our SDL 2 application runs, the operating system needs to be able t ...
- windows2012服务器中安装php7+mysql5.7+apache2.4环境
1.下载安装apache.2.4 https://home.apache.org/~steffenal/VC14/binaries/httpd-2.4.38-win64-VC14.zip 解压到d盘的 ...
- ubuntu16.4下使用QT修改系统时间
我也是在网上找的,自己随便改了一下六个lineEdit控件,每个控件输入日期时间,点击按钮触发函数可修改时间. 1 //一键修改系统时间 QString year = ui->lineEdit_ ...
- 源码解析Django CBV的本质
Django CBV模式的源码解析 通常来说,http请求的本质就是基于Socket Django的视图函数,可以基于FBV模式,也可以基于CBV模式. 基于FBV的模式就是在Django的路由映射表 ...
- 如果没有<form>标签,也没有enctype="multipart/form-data"属性,怎么使用formData对象提交表单呢?如下方式
form标签的enctype属性 enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码. 默认地,表单数据会编码为 "application/x-www-form-urlen ...
- vertx的HttpServer模块
Start HttpServer /** * 启动 HttpServer * multi instances 采用 synchronized防止线程安全问题 * addHandlers 方法是acto ...
- VMware14虚拟机上使用Ubuntu16.04遇到的各种问题(不定期更新)
1.ubuntu系统界面无法全屏铺满的问题 网上大部分解决方案都是使用vmware tools,我没尝试过,不过这里推荐一个更加简单的方法,只需要输入两行命令 第一步:sudo apt-get ins ...