Python: RDBMS: Hierarchical Data

18th May 2021 at 10:39pm

Python 实现树状结构的库的调研。RDBMS 处理树状结构的主要模型见 RDBMS: Pattern: Hierarchical Data。主要有这些库:

django-tree-queries 的作者写了一篇 博客,表示它做这个库的原因以及对其他库的调研。

django-treebeard

  • adjacency list 没有使用 CTE 来查询,而是递归查询,性能差
  • 该库最推荐 materialized path 方式
  • materialized path 及 nested set 方式有 tree corruption 可能,需要使用方使用事务
  • API 接口相对复杂且不够优雅(毕竟是个十几年的项目了)

django-mptt:Nested set 实现中最受推崇的。但是已经不再维护。

django-tree-queries

  • 使用 adjacency list 及 CTE
  • 实现简单,没有 tree corruption 可能
  • API 简单,可查完整 ancestors 及 descendants(支持 sibling 排序)
  • Adjacency list 查直接 parent 或 children 非常简单
  • 没有文档,需要看库的测试用例,但是用例非常易懂

总结:个人觉得 django-tree-queries 是最佳选择。但它文档较少,使用时看看它的 测试代码

另外,这些库都不支持单节点多 parent 的模型。