设计线程评论系统的最佳方法是什么,这样才不会破坏数据库?
答案 0 :(得分:4)
Modified pre-order tree traversal(或Matt称之为“嵌套集”)是可行的方法。
如果您正好在Django工作,那么第三方应用程序django-mptt会使您的模型中的MPTT实现单线程。
答案 1 :(得分:1)
我猜你的问题是关于安排系统所以你不必像以下那样工作:
我建议用一个线程键设置db表,该线程键是该帖子所有父节点的字符串。您必须将讨论限制在某个深度,但您的sql语句将是直接选择并按线程键排序,从而返回线程注释。减少对数据库和Web服务器的负担。
一个线程键就像它的当前post id连接到它的父级的带有分隔符的线程键上。
听起来怎么样?
答案 2 :(得分:1)
本网站列出了一些常用技巧: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
我会做“嵌套集”模型,但有多个根(例如每个“主题”是一个新树)。它非常快速,查询简单,但维护起来很复杂......
答案 3 :(得分:1)
SELECT ... START WITH ... CONNECT BY
Oracle对SELECT有一个扩展,允许基于树的检索。
此查询将遍历一个表,其中嵌套关系存储在父和子列中。
select * from my_table
start with parent = :TOP_ARTICLE
connect by prior child = parent;
答案 4 :(得分:0)
在这种情况下我通常做的是拥有一个负责将数据放入数据库的线程,并让所有辅助线程向该线程报告,然后该线程将数据排队,并按顺序写入,或分批(取决于要求,以及我愿意忍受多少数据库活动)。
答案 5 :(得分:0)
我猜你有类似“评论”表的东西,带有自己的外键,指向每行的父评论。这使得线程注释成为树结构,并将线程启动器作为树根。
所以我们可以将这个问题改为“从数据库中选择树结构的最佳方法是什么?”。好吧,我不会假设知道最好的方法,但我的第一个倾向(可能是错误的)是使用存储过程来遍历树,并编译要返回的行列表。它仍然需要多个select语句来获取所有子项,但它只是一次数据库往返。
Aryeh使用累积父列表的方法可能更好:)
答案 6 :(得分:0)
我必须提出使用link text技术的Carl Meyer的建议。我正在研究这样的系统,但对论坛进行了一些进一步的优化。
在支持回复的论坛系统中,您经常会在树的中间插入,这会导致性能不佳。为了减轻痛苦,我正努力在数字线上留出空白。这类似于在数组列表中预分配内存。向右移动树的成本对于1和100是相同的。因此,对于连续的回复(更有可能),我可以更新更少的树节点,它们会更快。
缩小是通过比较当前节点左右值将中断来计算后代节点(此帖子下面的回复数)。可以将此信息缓存在数据结构中以快速实现。因此,在插入时,我将不得不用新计数更新所有祖先节点。更新的节点数量仍然会少得多,结果平均时间插入时间会快得多。
多个树存储在同一个表中。每棵树都有一个唯一的树ID,每个主题一个。较小的树更新更快。
希望有助于