设计线程评论系统

时间:2008-08-30 23:27:50

标签: sql

设计线程评论系统的最佳方法是什么,这样才不会破坏数据库?

7 个答案:

答案 0 :(得分:4)

Modified pre-order tree traversal(或Matt称之为“嵌套集”)是可行的方法。

如果您正好在Django工作,那么第三方应用程序django-mptt会使您的模型中的MPTT实现单线程。

答案 1 :(得分:1)

我猜你的问题是关于安排系统所以你不必像以下那样工作:

  1. 选择所有顶级评论
  2. 选择在之前的步骤中找到父母的所有评论
  3. 选择在之前的步骤中找到父母的所有评论
  4. ...重复直至找不到评论
  5. 我建议用一个线程键设置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;

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

Aryeh使用累积父列表的方法可能更好:)

答案 6 :(得分:0)

我必须提出使用link text技术的Carl Meyer的建议。我正在研究这样的系统,但对论坛进行了一些进一步的优化。

在支持回复的论坛系统中,您经常会在树的中间插入,这会导致性能不佳。为了减轻痛苦,我正努力在数字线上留出空白。这类似于在数组列表中预分配内存。向右移动树的成本对于1和100是相同的。因此,对于连续的回复(更有可能),我可以更新更少的树节点,它们会更快。

缩小是通过比较当前节点左右值将中断来计算后代节点(此帖子下面的回复数)。可以将此信息缓存在数据结构中以快速实现。因此,在插入时,我将不得不用新计数更新所有祖先节点。更新的节点数量仍然会少得多,结果平均时间插入时间会快得多。

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

希望有助于