树形结构数据存储方案(三):闭包表

将Closure Table翻译成闭包表不知道是否合适,闭包表的思路和物化路径差不多,都是空间换时间,Closure Table,一种更为彻底的全路径结构,分别记录路径上相关结点的全展开形式。能明晰任意两结点关系而无须多余查询,级联删除和结点移动也很方便。但是它的存储开销会大一些,除了表示结点的Meta信息,还需要一张专用的关系表。

以下图举例数据举例:

tree

创建主表:

创建关系表:

其中

  • Ancestor代表祖先节点
  • Descendant代表后代节点
  • Distance 祖先距离后代的距离

添加数据(创建存储过程)

完成后2张表的数据大致是这样的:(注意:每个节点都有一条到其本身的记录。)

Closure-Table-1

Closure-Table-2

查询Fruit下所有的子节点:

查询Fruit下直属子节点:

查询Fruit所处的层级:

另外要删除节点也非常的简单,这里就不再做过多的阐述。

参考链接:

  • https://coderwall.com/p/lixing/closure-tables-for-browsing-trees-in-sql
微信支付标点符 wechat qrcode
支付宝标点符 alipay qrcode

WordPress LaTeX插件更换记录

由于自己的博客要插入很多的公式,所以需要依赖LaTeX插件来帮忙实现。先前一直使用的是WP QuickLaTe

Docker容器内多用户版JupyterHub支持GPU

前一篇文章介绍了Docker下安装多用户版的JupyterHub,但安装完毕后会遇到一个问题:Docker内无

使用Docker安装多用户版的JupyterHub

宿主服务器使用的是Ubuntu 18.04,需要注意的是Docker目前不支持Ubuntu 19.10。如要在

10 Replies to “树形结构数据存储方案(三):闭包表”

  1. 请问,在什么场景下用闭包表合适?什么场景下不合适? 如果用 邻接表 + 物理路径 ,是否会比闭包表的方式更好的?谢谢

      1. 哦,有没有具体量化的? 比如我现在需要解决的场景是 动态层级的 社区内房屋树形结构,会最多有五个层级, 分别是 分区 、 栋、单元 、楼 、室 ,可以根据具体情况搭配不同的层级,二层,三层,四层,五层,这几种情况,目前数据量不大,希望博主能给点建议,目前用 mysql 如何设计数据结构,非常感谢

      2. 昨晚试了下,的确直接查节点的直属父,直属子很方便,但是,我有个需要时,拿到末尾节点之后需要同时拿到末尾节点的全称,即末尾节点的每一级父节点名称,衔接起来一起返回数据,考虑了下,按照闭包表的话,我的做法是,先从 存数据的表通过逻辑拿到所有的末节点,然后再到关系表中,逐一查出每个末节点的每一级父节点名称,拼凑起来,感觉这样查询次数会比较多比较麻烦,请问有什么好的办法吗?非常感谢

  2. 请教博主,采用这种方法存储树结构的话应该如果将树结构还原到内存中?

  3. 存储过程运行结果不对,distance 前九位数分别是0,1,2,3—-8,请问是否第一个参数是否是 call AddNode(”,’Food’)?

dingding进行回复 取消回复

电子邮件地址不会被公开。 必填项已用*标注