2008-08-30 197 views

回答

0

我在这种情况下通常会做的是让一个线程负责将数据放入数据库,并让所有辅助线程向该线程报告,然后将该数据排队,然后将其写入串行,或分批(取决于需求,以及我愿意忍受多少数据库活动)。

1

我猜你的问题是关于安排系统,让您不必上班:

  1. 选择所有的顶级评论
  2. 选择他们的父母在步骤发现所有评论之前
  3. 选择他们的父母在之前
  4. 步骤发现所有评论...重复,直到没有评论发现

我会建议使用一个线程键设计数据库表,这将是该职位的所有父母的字符串。你必须限制你的讨论到一定的深度,但是你的sql语句应该是直接选择和按线程键排序,给你回线程注释。对您的数据库和Web服务器征税较少。

一个线程键会像它的当前职位ID加入到它的父母的线程键与分隔符。

这听起来怎么样?

0

我猜你有类似“评论”表的东西,有一个外键自己,指向每行的父注释。这使得线程注释成为以线程启动器作为树根的树结构。

所以我们可以将这个问题改为“从数据库中选择树结构的最佳方法是什么?”。那么我不会假设知道最好的方式,但是我的第一个倾向(可能是错误的)是使用存储过程来遍历树,并编译要返回的行列表。它仍然需要多个选择语句来获取所有的孩子,但它只是一次数据库往返。

Aryeh的方法与积累父列表可能是更好:)

1

SELECT ... START WITH ... CONNECT BY

Oracle有一个扩展选择,允许轻松基于树的检索。

这个查询将穿越其中的嵌套关​​系存储在孩子列的表。

select * from my_table 
    start with parent = :TOP_ARTICLE 
    connect by prior child = parent; 

http://www.adp-gmbh.ch/ora/sql/connect_by.html

4

Modified pre-order tree traversal(或什么马特提到的 “嵌套组”)是要走的路。

如果你碰巧在Django工作,那么有一个第三方应用django-mptt,这使得在你的模型中实现MPTT是一个单线程。

0

我不得不第二次卡尔迈尔的建议,使用link text技术。我现在正在研究这样一个系统,但是对于论坛还有一些进一步的优化。

在支持回复的论坛系统中,您经常会插入树中间,从而导致性能下降。为了减少我正在努力让数字线上的空白的痛苦。这工作就像在数组列表中预先分配内存。向右移动树的成本对于1和100是相同的。因此,在连续回复(更有可能)时,我可以更新更少的树节点,并且它们将更快。

缩小规模是通过比较当前节点的左右值来中断后代节点的计数(本帖下面的回复数)。这些信息可以缓存在数据结构中以实现快速。所以在插入时,我将不得不用新计数来更新所有的祖先节点。更少的节点将被更新,结果将会大大加快平均情况下的插入时间。

多棵树被存储在同一个表中。每棵树都有一个唯一的树ID,每个主题一个。更小的树更新更快。

希望帮助