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

将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

使用Python检测符号及乱码字符

最近在进行关键词的分析,中间涉及到对一些特殊的字符进行过滤的需求。包括带符号的(有部分还是SQL注入),并且存

PHP版本升级记录(7.0到7.4)

服务器上原先安装的版本为PHP 7.0.33, WordPress后台建议安装的最小版本为7.3,所以打算直接

WordPress LaTeX插件更换记录

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

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

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

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

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

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

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

offs进行回复 取消回复

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