11

有两个著名的 Django 包用于创建树结构:django-treebearddjango-mptt。最近Django CMS开始使用 django-treebeard 代替 django-mptt。Wagtail CMS也在使用 django-treebeard。

是什么让 django-treebeard 成为比 django-mptt 更可取的选择?

4

3 回答 3

15

主要区别在于 SQL 树实现的选择。

django-mptt 使用嵌套集,读取速度快,写入速度慢。

Treebeard 提供嵌套集,以及邻接列表(快速写入、慢速读取)和物化路径(快速读取、快速写入)。

还有其他区别。django-mptt 有更好的 API 和更好的文档。

于 2016-05-22T13:31:22.163 回答
4

最重要的django-mptt是,明确未维护:

https://github.com/django-mptt/django-mptt#this-project-is-currently-unmaintained

因此,在这一点上,使用django-mptt会带来很大的风险,即您将无法使用其他软件包的当前版本(取决于 django-mptt),并且最终会遇到需要您切换到不同软件包的问题,​​例如django-treebeard.

Postgres 用户的旁注

顺便说一句,对于 Postgres 用户,还有另一个有趣的 mptt 替代方案:(ltreehttps://www.postgresql.org/docs/current/ltree.html

目前(在我写这篇文章的时候),没有用于ltree与 Django 集成的维护包。但是,django-treebeard 在添加 ltree 支持方面存在一个未解决的问题:https ://github.com/django-treebeard/django-treebeard/issues/170

同时,它很容易在没有包的情况下实现。这是我找到的一个演示:https ://github.com/peopledoc/django-ltree-demo 。我可以确认这个演示仍然运行良好(即使代码已经有几年了)。

于 2021-05-14T21:11:29.283 回答
2

您可以使用 treebeard 获得更多选项,它允许使用相同 API 实现多个树。

TREEBEARD: Adjacency List, Materialized Path, & Nested Sets

MPTT: NESTED sets

此外,MPTT 在涉及超过 1000 个节点的大树操作中可能会较慢,所以我认为项目规模应该考虑到您的考虑因素。

有关更多信息,请查看 TREEBEARD 维护者之一 Jacob Rief 的DjangoCon Talk。演讲是关于“Representing Hierarchies in Relational Databases”查看他的GitHub

于 2020-07-13T11:36:12.433 回答