如何高效处理树状结构数据

本文探讨了在处理树状结构数据时的四种常见存储方案:邻接表、物化路径、左右值编码和闭包表。对于文章目录或层级较少的情况,邻接表和物化路径适用;而分销系统等需要频繁查询多层下级关系的场景,推荐使用闭包表以换取更好的查询性能。

最近在看到帖子,问道如何存储树状结构数据,常见使用场景就是文章的目录层级,分销关系。

回顾之前做了分销商城系统里面有一个分销功能,涉及到购买用户上下级关联、查询,还要修改上下级关系。原本很早就想写一篇文章来记录的,拖了好久,直到我看到一篇文章已经总结得很好:树形结构存储方案对比分析

参考对比

总结:

  • Adjacency List 邻接表:每一条记录存parent_id 【最简单,常用的,层级小可用】
  • Path Enumerations 物化路径:每一条记录存整个tree path经过的node枚举 【最简单,常用的,层级小可用,建议配合邻接表使用】
  • Nested Sets 左右值编码:每一条记录存节点 left 和 right 【新增、修改节点复杂、耗时,查询节点全部下级,难以实现查询节点的指定层级的下级】
  • Closure Table 闭包表:额外维护一个表,记录节点和子节点的全部关系和距离【采用空间换时间,新增、修改节点简单但存储数据倍增,查询性能好,支持查看节点的下级】

如果是文章的目录层级啥的,本身树状节点不多,采用Adjacency List 邻接表 + Nested Sets 左右值编码即可。这里可以满足80%需求。

分销系统通常节点数量比较多,经常需要查询,而且查询节点的N层下级,作为分佣计算,建议采用Closure Table 闭包表方案。对性能有要求的,建议直接上手这个。

参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值