sqlalchemy计数后代

时间:2014-02-19 13:44:02

标签: python sql sqlalchemy

我有一个自我参考的sqlalchemy模型。这很简单,它是一个帖子表,每个帖子都可以回复另一个帖子。没有深度限制。

class Post(db.Model):
    post_id = db.Column(db.Integer, primary_key=True)
    parent_id = db.Column(db.Integer, db.ForeignKey('post.post_id')
    [...]
    replies = db.relationship('Post')

我需要一种方法来计算帖子的回复数量。尽可能深。所以回复回复的回复等都算作回复..

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:2)

这里的内容基本上是使用tree存储的adjacency list

虽然您可以使用a relatively simple recursive function完成所需的操作,但效率非常低,因为您需要多次查询数据库以获取每个帖子的子项。

存储此类数据的另一种稍微复杂的方法称为修改预订树遍历(MPTT)。它更有效率,因为您可以在单个查询中从任何树中获取所需的数据 - 您甚至可以在不获取任何实际回复数据的情况下计算回复数量。

您可以通过MPTT on this article找到邻接列表的非常好的概述。

如果您不想自己实现,特别是对于SQLAlchemy,您可以使用SQLAlchemy-ORM-tree