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

10 sec read

将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

C语言学习:size_t

在学习C语言的时候,遇到了一个新的数据类型size_t,截止目前也没有完全理清这个类似的具体场景及出现的原因。
44 sec read

C语言学习:main()函数的正确写法

C语言虽然是一门古老的语言,但是其标准一直在完善,所以很多以前支持的语法在到当前已经不能在使用了。 C语言的版
41 sec read

Scipy数学函数的Scala实现

最近在推进项目的时候,遇到需要将线下的Python代码转化成线上的集群代码,由于机器代码环境是Scala,所以
4 min read

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

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

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

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

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

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

发表评论

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