我有一个自我参考的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')
我需要一种方法来计算帖子的回复数量。尽可能深。所以回复回复的回复等都算作回复..
任何帮助将不胜感激
答案 0 :(得分:2)
这里的内容基本上是使用tree存储的adjacency list。
虽然您可以使用a relatively simple recursive function完成所需的操作,但效率非常低,因为您需要多次查询数据库以获取每个帖子的子项。
存储此类数据的另一种稍微复杂的方法称为修改预订树遍历(MPTT)。它更有效率,因为您可以在单个查询中从任何树中获取所需的数据 - 您甚至可以在不获取任何实际回复数据的情况下计算回复数量。
您可以通过MPTT on this article找到邻接列表的非常好的概述。
如果您不想自己实现,特别是对于SQLAlchemy,您可以使用SQLAlchemy-ORM-tree