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数据库. 在程序连接数据量过程中,不要修改数据表的结构.比如在连接状态中使用下面的软件修改数据表结构,这个软件立即就会卡 ...
随机推荐
- 2、搭建一个简单的Web项目
一.创建一个Web项目: 1.File->new Project->Java->JavaEE->Web Application 2.为项目起名: 3.配置项目:在项目上击右键- ...
- laravel-mix的安装
Laravel-mix的安装 Laravel Mix 是一款前端任务自动化管理工具,使用了工作流的模式对制定好的任务依次执行.Mix 提供了简洁流畅的 API,让你能够为你的 Laravel 应用定义 ...
- 前端node.js npm i 报错Unexpected end of JSON input while parsing near
清缓存 npm cache clean --force 重新安装 npm install
- 关于操作HDFS的一个问题
近日写程序定时任务调Hadoop MR程序,然后生成报表,发送邮件,当时起了两个任务A和B,调MR程序之前,会操作hdfs(读写都有),任务A每天一点跑,任务B每十分钟跑一次,B任务不会调用MR程序, ...
- webstorm Terminal 位置错乱解决方案
win+R 打开终端,右击属性->勾选使用旧版控制台->确定 ,再重启webstrom 即可.
- 成环的概率dp(初级) zoj 3329
原题地址:https://vjudge.net/problem/ZOJ-3329 题目大意: 有三个骰子,分别有k1,k2,k3个面,初始分数是0.第i骰子上的分数从1道ki.当掷三个骰子的点数分别为 ...
- 树链剖分——线段树区间合并bzoj染色
线段树区间合并就挺麻烦了,再套个树链就更加鬼畜,不过除了代码量大就没什么其他的了.. 一些细节:线段树每个结点用结构体保存,pushup等合并函数改成返回一个结构体,这样好写一些 struct Seg ...
- @angular/cli (angular脚手架) 如何降级
1.卸载 npm uninstall -g @angular/cli 2.清除缓存 npm cache verify 3.查看是否卸载成功 ng v //如果显示ng 不是内部或外部的指令 则证明卸载 ...
- 小程序+node+mysql做的小项目
git源码地址: https://github.com/songkangle/weixin_node 小程序页面 数据库 user表 dream表 node的express框架index.js var ...
- MySQL5.7 关键字和保留关键字
来源:https://dev.mysql.com/doc/refman/5.7/en/keywords.html 标有(R)的为保留关键字. A ACCESSIBLE (R) ACCOUNT; add ...