Python 实现树状结构的库的调研。RDBMS 处理树状结构的主要模型见 RDBMS: Pattern: Hierarchical Data。主要有这些库:
- django-tree-queries:实现 adjacency list,用 CTE 做查询
- django-treebeard:实现 adjacency list、materialized path 及 nested set
- django-mptt:实现 nested set
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 的模型。