闭包表记录了树中所有节点的关系,不仅仅只是直接父子关系,它需要使用2张表,除了节点表本身之外,还需要使用1张表来存储节祖先点和后代节点之间的关系(同时增加一行节点指向自身),并且根据需要,可以增加一个字段,表示深度。因此这种方法数据量很多。设计的表结构如下:

create table `node` (`id` int(10) not null,`name` varchar(50) default null,primary key (`id`)
) engine=innodb default charset=utf8;create table `tree_path` (`anc` int(10) not null comment '祖先节点',`des` int(10) not null comment '子孙节点',`pc` int(1) default null comment '是否为父子节点 1/0',primary key (`anc`,`des`)
) engine=innodb default charset=utf8;-- 示例树
-- root(0)
--     |
--     a(1)
--     |___a1(2)
--     |___a2(3)
--     b(4)
--     |___b1(5)
--     |___b2(6)
--     |___c(7)
--         |___c1(8)
--         |___d(9)
--             |___e(10)insert into node(id,name) values (0,'root');
insert into node(id,name) values (1,'a');
insert into node(id,name) values (2,'a1');
insert into node(id,name) values (3,'a2');
insert into node(id,name) values (4,'b');
insert into node(id,name) values (5,'b1');
insert into node(id,name) values (6,'b2');
insert into node(id,name) values (7,'c');
insert into node(id,name) values (8,'c1');
insert into node(id,name) values (9,'d');
insert into node(id,name) values (10,'e');insert into tree_path(anc,des,pc) values (0,1,1);
insert into tree_path(anc,des,pc) values (0,2,0);
insert into tree_path(anc,des,pc) values (0,3,0);
insert into tree_path(anc,des,pc) values (0,4,1);
insert into tree_path(anc,des,pc) values (0,5,0);
insert into tree_path(anc,des,pc) values (0,6,0);
insert into tree_path(anc,des,pc) values (0,7,0);
insert into tree_path(anc,des,pc) values (0,8,0);
insert into tree_path(anc,des,pc) values (0,9,0);
insert into tree_path(anc,des,pc) values (0,10,0);insert into tree_path(anc,des,pc) values (1,1,0);
insert into tree_path(anc,des,pc) values (2,2,0);
insert into tree_path(anc,des,pc) values (3,3,0);
insert into tree_path(anc,des,pc) values (4,4,0);
insert into tree_path(anc,des,pc) values (5,5,0);
insert into tree_path(anc,des,pc) values (6,6,0);
insert into tree_path(anc,des,pc) values (7,7,0);
insert into tree_path(anc,des,pc) values (8,8,0);
insert into tree_path(anc,des,pc) values (9,9,0);
insert into tree_path(anc,des,pc) values (10,10,0);insert into tree_path(anc,des,pc) values (1,2,1);
insert into tree_path(anc,des,pc) values (1,3,1);insert into tree_path(anc,des,pc) values (4,5,1);
insert into tree_path(anc,des,pc) values (4,6,1);
insert into tree_path(anc,des,pc) values (4,7,1);
insert into tree_path(anc,des,pc) values (4,8,0);
insert into tree_path(anc,des,pc) values (4,9,0);
insert into tree_path(anc,des,pc) values (4,10,0);insert into tree_path(anc,des,pc) values (7,8,1);
insert into tree_path(anc,des,pc) values (7,9,1);
insert into tree_path(anc,des,pc) values (7,10,0);insert into tree_path(anc,des,pc) values (9,10,1);删除子树
假设要删除子树#7delete from tree_path
where tree_path.des in (select t.des from tree_path t where t.anc=7)移动子树
假设我们要把子树#7从节点#4移动到节点#1
1.分离子树,删除子树节点与其祖先的关系
delete from tree_path where tree_path.anc=72.将上一步分离出的子树用笛卡尔积嫁接到#1下
selectsuper.anc,sub.des,casewhensuper.anc=1 and sub.des=7 then 1else 0end pc
fromtree_path supercross jointree_path sub
wheresuper.des=1 and sub.anc=7查询树形结构
xxxxxx

树形结构与关系数据库之闭包表相关推荐

  1. 树形结构在关系数据库中的设计

    在程序设计中,经常以树形结构表示数据的层次关系,如菜单的结构.商品的分类等. 这样的层次结构在关系数据库中难以直观地表示.常见的一种做法是用一个字段指向上级节点来表示记录的上下级关系. fid pid ...

  2. 数据库树形结构、多级联动的表设计

    问题:二级联动.多级联动等树形结构的数据,如何设计表格. 场景:省市县三级联动.商品的分类等. 参考:https://www.zhihu.com/question/20417447 最常用的一种方法是 ...

  3. 玩转Redis-Lua脚本入门到实战-树形结构存储及查询

      <玩转Redis>系列文章 by zxiaofan主要讲述Redis的基础及中高级应用,穿插企业实战案例.本文是<玩转Redis>系列第[16]篇,最新系列文章请前往 公众 ...

  4. 部门树形结构,使用Treeview控件显示部门

    部门树形结构.设计张部门表用于存储部门编码.名称.上级部门id,使用Treeview控件显示部门树,并实现部门增删改.移动.折叠等功能.特别提示,部门有层级关系,可用donetbar的adtree控件 ...

  5. mysql 存树 闭包表_关系型数据库树形关系存储-闭包表

    前言 在关系型数据库中,有一种逻辑关系比较难处理,这种就是树形结构.目前有很多主流的处理方案,比如说直接在业务表中存储上一级id,这样就可以用递归查询SQL的形式找到某一节点的父节点,子节点,或者兄弟 ...

  6. 树形结构表3种设计优劣分析与分享

    简介 在开发中经常遇到树形结构的场景,本文将以部门表为例对比几种设计的优缺点: 问题 需求背景:根据部门检索人员, 问题:选择一个顶级部门情况下,跨级展示当前部门以及子部门下的所有人员,表怎么设计更合 ...

  7. MySQL—通过Adjacency List(邻接表)存储树形结构

    转载自:Mysql通过Adjacency List(邻接表)存储树形结构 今天来看看一个比较头疼的问题,如何在数据库中存储树形结构呢?像mysql这样的关系型数据库,比较适合存储一些类似表格的扁平化数 ...

  8. 树形结构的数据存储和数据库表设计

    ID int 主键 OBJECTNAME nvarchar(50) 对象名称 OBJECTTYPE  nvarchar(1)  对象级别 PARENTID int 对象父ID 其实对象级别这个字段可以 ...

  9. 数据库学习,树形结构的数据库表Schema设计方案

    2019独角兽企业重金招聘Python工程师标准>>> 程序设计过程中,我们常常用树形结构来表征某些数据的关联关系,如企业上下级部门.栏目结构.商品分类等等,通常而言,这些树状结构需 ...

最新文章

  1. git--命令行放弃修改
  2. 机器学习规则 (Rules of Machine Learning): 关于机器学习工程的最佳实践
  3. PHP+Mysql高仿百度知道签到源码演示与下载
  4. SQL SERVER 一个SQL语句的执行顺序
  5. 当代大学查寝奇葩操作大赏 | 今日最佳
  6. db2有主键时默认hash分区_MySQL分区表最佳实践
  7. php修改mysql数据找不到_php 如何修改mysql数据
  8. 编写一个脚本,用它来操纵QTP的运行
  9. pycharm 安装PYQ5以及no Qt platform plugin could be initialized的问题
  10. 大学java怎么算学得好_为什么现在大学里很多计算机系的大学生,学编程的时候总学不好...
  11. wordpress发送测试邮件
  12. Connect() 2016 大会的主题 ---微软大法好
  13. .net反编译工具Reflector下载(转)
  14. 《那些年啊,那些事——一个程序员的奋斗史》——10
  15. oracle psu无法开库,Oracle 12.2应用PSU后数据库无法启动
  16. 解决高度塌陷的几种方法
  17. api 微信内置浏览器js_【微网站开发】之微信内置浏览器API使用
  18. 2021年最新抓取微博所有图片,所有视频,所有评论,保存数据库excel
  19. 小米生态链企业商米科技完成数亿元C+轮融资,蚂蚁金服投资...
  20. 发扑克牌java程序_Java实现简易扑克牌游戏

热门文章

  1. java弃用标签_Java 9 揭秘(15. 增强的弃用注解)
  2. angular5 接口跨域请求配置
  3. Android插件化技术调研
  4. Spring4基础 学习笔记(5) ---- Spring与Dao
  5. iOS10 资料汇总:值得回看的 10 篇 iOS 热文
  6. OpenGL小试牛刀第一季
  7. JAVA的嵌入式脚本开发(中)
  8. uni-app请求图片的路径是反斜杠如何解决
  9. Swift5版本以上自定义回调函数报错
  10. XCode的使用心得