最近在看到帖子,问道如何存储树状结构数据,常见使用场景就是文章的目录层级,分销关系。
回顾之前做了分销商城系统里面有一个分销功能,涉及到购买用户上下级关联、查询,还要修改上下级关系。原本很早就想写一篇文章来记录的,拖了好久,直到我看到一篇文章已经总结得很好:树形结构存储方案对比分析

总结:
- Adjacency List 邻接表:每一条记录存parent_id 【最简单,常用的,层级小可用】
- Path Enumerations 物化路径:每一条记录存整个tree path经过的node枚举 【最简单,常用的,层级小可用,建议配合邻接表使用】
- Nested Sets 左右值编码:每一条记录存节点 left 和 right 【新增、修改节点复杂、耗时,查询节点全部下级,难以实现查询节点的指定层级的下级】
- Closure Table 闭包表:额外维护一个表,记录节点和子节点的全部关系和距离【采用空间换时间,新增、修改节点简单但存储数据倍增,查询性能好,支持查看节点的下级】
如果是文章的目录层级啥的,本身树状节点不多,采用Adjacency List 邻接表 + Nested Sets 左右值编码即可。这里可以满足80%需求。
分销系统通常节点数量比较多,经常需要查询,而且查询节点的N层下级,作为分佣计算,建议采用Closure Table 闭包表方案。对性能有要求的,建议直接上手这个。
参考:

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

3586

被折叠的 条评论
为什么被折叠?



