Sql 设计一个线程评论系统

Sql 设计一个线程评论系统,sql,Sql,设计一个线程化评论系统的最佳方法是什么,这样它就不会影响数据库?在这种情况下,我通常会使用一个线程,负责将数据放入数据库,并让所有辅助线程向该线程报告,然后该线程对数据进行排队,然后串行写入数据,或者分批进行(取决于需求,以及我愿意忍受多少数据库活动)。我猜您的问题是如何安排系统,这样您就不必按照以下方式工作: 选择所有顶级注释 选择在上一步中找到其父级的所有注释 选择在上一步中找到其父级的所有注释 。。。重复此操作,直到找不到任何注释 我建议使用一个线程键设计db表,该线程键是该帖子所有父项的

设计一个线程化评论系统的最佳方法是什么,这样它就不会影响数据库?

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

我猜您的问题是如何安排系统,这样您就不必按照以下方式工作:

  • 选择所有顶级注释
  • 选择在上一步中找到其父级的所有注释
  • 选择在上一步中找到其父级的所有注释
  • 。。。重复此操作,直到找不到任何注释
  • 我建议使用一个线程键设计db表,该线程键是该帖子所有父项的字符串。您必须将讨论限制在一定的深度,但是您的sql语句将按线程键直接选择和排序,并返回线程注释。减少数据库和Web服务器的负担

    线程键类似于它的当前post id,用分隔符连接到其父线程键上


    听起来怎么样?

    我猜你有一个类似于“comments”表的东西,它本身有一个外键,指向每行的父注释。这将使线程化注释成为一个树结构,并以线程启动程序作为树根

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


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

    该网站列出了一些常用技术:


    我会使用“嵌套集”模型,但有多个根(例如,每个“主题”都是一个新的树)。它非常快速,查询简单,但维护复杂…

    选择。。。从。。。通过

    Oracle有一个可供选择的扩展,允许轻松进行基于树的检索

    此查询将遍历嵌套关系存储在parentchild列中的表

    select * from my_table
        start with parent = :TOP_ARTICLE
        connect by prior child = parent;
    
    (或者Matt称之为“嵌套集”)是一条路要走


    如果您碰巧在Django工作,那么有一个第三方应用程序,它使在您的模型中实现MPTT成为一个简单的过程。

    我必须支持Carl Meyer关于使用该技术的建议。我现在正在开发一个这样的系统,但是对论坛进行了一些进一步的优化

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

    “缩小”是通过比较当前节点的“左”和“右”值来计算后代节点(此帖子下方的回复数)。可以将这些信息缓存在数据结构中,以提高速度。所以在insert上,我必须用新的计数更新所有祖先节点。更新的节点更少,结果是平均案例插入时间更快

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

    希望有帮助