数据库设计:邻接表、路径枚举、嵌套集、闭包表

本文探讨了数据库中存储树形结构的几种方法,包括邻接表、路径枚举、嵌套集和闭包表。邻接表配合路径枚举适合普通树结构,闭包表适用于树深度未知的情况,而嵌套集则有利于快速查询子节点。在评论系统设计中,闭包表能更直观地获取祖先和后代节点。选择合适的数据结构对于高效查询和维护树形数据至关重要。
摘要由CSDN通过智能技术生成

邻接表

通用设计父级id字段

路径枚举

设计祖级列表字段,所谓祖级列表就是当前节点的所有父级节点的id集

路径枚举实现递归查询当前节点下所有字节点方案:

1:MySQL find_in_set函数 与 in 结合使用

2:若做数据库兼容则可使用like替代find_in_set

嵌套集

嵌套集解决方案是存储子孙节点的相关信息,而不是节点的直接祖先。我们使用两个数字来编码每个节点,从而表示这一信息,可以将这两个数字称为nsleft 和 nsright。
每个节点通过如下的方式确定nsleft 和nsright 的值:nsleft的数值小于该节点所有后代ID,同时nsright 的值大于该节点的所有后代的ID。这些数字和comment_id 的值并没有任何关联。
确定这三个值(nsleft,comment_id,nsright)的简单方法是对树进行一次深度优先遍历,在逐层深入的过程中依次递增地分配nsleft的值,并在返回时依次递增地分配nsright的值。

闭包表

闭包表是解决分级存储的一个简单而优雅的解决方案,它记录了树中所有节点间的关系,而不仅仅只有那些直接的父子节点。
在设计评论系统时,我们额外创建了一个叫 tree_paths 表,它包含两列,每一列都指向 comments 中的外键。
我们不再使用comments 表存储树的结构,而是将树中任何具有(祖先 一 后代)关系的节点对都存储在treepaths 表里,即使这两个节点之间不是直接的父子关系;同时,我们还增加一行指向节点自己通过treepaths 表来获取祖先和后代比使用嵌套集更加的直接

综上所述结合树的深度可以划分:

普通树结构:邻接表与路径枚举结合使用

树深度未知:闭包表

查询多少:嵌套集

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值