【MySQL疑难杂症】如何将树形结构存储在数据库中(方案三 Closure Table)

【MySQL疑难杂症】如何将树形结构存储在数据库中(方案三 Closure Table),第1张

概述今天介绍将树形结构存储在数据库中的第三种方法——终结表(原谅我这生硬的翻译。。)。 继续用上一篇的栗子,下面是要存储的结构图: 需要回答的问题依旧是这样几个: 1.查询小天的直接上司。 2.查询老宋管

  今天介绍将树形结构存储在数据库中的第三种方法——终结表(原谅我这生硬的翻译。。)。

  继续用上一篇的栗子,下面是要存储的结构图:

  需要回答的问题依旧是这样几个:

  1.查询小天的直接上司。

  2.查询老宋管理下的直属员工。

  3.查询小天的所有上司。

  4.查询老王管理的所有员工。

方案三、Closure table 终结表法,保存每个节点与其各个子节点的关系,也就是记录以其为根节点的全部子节点信息。直接上代码就明白了:

  这里要创建两个表,一个表用来存储信息:

CREATE table employees3(eID INT,ename VARCHAR(100),position ))

  一个表用来存储关系:

 emp_relations(root_ID tinyint(1)

  这里的root_ID用来存放以其为根节点的路径,node_ID表示节点处的eID,depth表示根节点到该节点的深度,is_leaf表示该节点是否为叶子节点。

  接下来插入数据:

  可以看出,这个关系表有点大,我们先来看看查询效果如何:

  1.查询小天的直接上司。

  这里只需要在关系表中找到node_ID为小天ID,depth为1的根节点ID即可。

SELECT e2.ename BOSS FROM employees3 e1,employees3 e2,emp_relations rel WHERE e1.ename='小天' AND rel.node_ID=e1.eID AND rel.depth=1 AND e2.eID=rel.root_ID

  查询结果如下:

  

  2.查询老宋管理下的直属员工。

  思路差不多,只要查询root_ID为老宋eID且深度为1的node_ID即为其直接下属员工ID

SELECT e1.eID,e1.ename 直接下属 WHERE e2.ename老宋AND rel.root_ID=e2.eID AND e1.eID=rel.node_ID

  查询结果如下:

  

  3.查询小天的所有上司。

  只要在关系表中找到node_ID为小天eID且depth大于0的root_ID即可

SELECT e2.eID,e2.ename 上司 >0 =rel.root_ID

  查询结果如下:

  

  4.查询老王管理的所有员工。

  只要在关系表中查找root_ID为老王eID,depth大于0的node_ID即可

老王=rel.node_ID

  查询结果如下:

 

  我们可以发现,这四个查询的复杂程度是一样的,这就是这种存储方式的优点,而且可以让另一张表只存储跟节点紧密相关的信息,看起来更简洁。但缺点也显而易见,关系表会很庞大,当层次很深,结构很庞大的时候,关系表数据的增长会越来越快,相当于用空间效率来换取了查找上的时间效率。

  至此,树形结构在数据库中存储的三种方式就介绍完了,接下来对比一下三种方法:

  方案一:Adjacency List

  优点:只存储上级ID,存储数据少,结构类似于单链表,在查询相邻节点的时候很方便。添加删除节点都比较简单。

  缺点:查询多级结构的时候会显得力不从心。

  适用场合:对多级查询需求不大的场景比较适用。

  方案二:Path Enumeration

  优点:查询多级结构的时候比较方便。查询相邻节点时也比较ok。增加或者删除节点的时候比较简单。

  缺点:需要存储的path值可能会很大,甚至超过设置的最大值范围,理论上无法无限扩张。

  适用场合:结构相对简单的场景比较适合。

  方案三:Closure table

  优点:在查询树形结构的任意关系时都很方便。

  缺点:需要存储的数据量比较多,索引表需要的空间比较大,增加和删除节点相对麻烦。

  适用场合:纵向结构不是很深,增删 *** 作不频繁的场景比较适用。

  当然,也可以再自己创新出其他更好的存储方案,如果有更好的想法,欢迎提出交流。

  至此三种方案全部介绍完毕,欢迎大家继续关注。

  我的博客即将同步至腾讯云+社区,邀请大家一同入驻。

总结

以上是内存溢出为你收集整理的【MySQL疑难杂症】如何将树形结构存储在数据库中(方案三 Closure Table)全部内容,希望文章能够帮你解决【MySQL疑难杂症】如何将树形结构存储在数据库中(方案三 Closure Table)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1152811.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存