【问题标题】:Designing a threaded commenting system [closed]设计一个线程评论系统[关闭]
【发布时间】:2010-09-07 09:07:10
【问题描述】:

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

【问题讨论】:

    标签: sql


    【解决方案1】:

    我必须赞同 Carl Meyer 的建议才能使用 link text 技术。我现在正在开发这样的系统,但对论坛进行了一些进一步的优化。

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

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

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

    希望有帮助

    【讨论】:

      【解决方案2】:

      选择...开始...连接方式

      Oracle 对 SELECT 进行了扩展,可以轻松进行基于树的检索。

      此查询将遍历一个表,其中嵌套关系存储在 parentchild 列中。

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

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

      【讨论】:

        【解决方案3】:

        Modified pre-order tree traversal(或马特所说的“嵌套集”)是要走的路。

        如果您碰巧在 Django 中工作,那么有一个第三方应用程序 django-mptt,它可以让您在模型中实现 MPTT。

        【讨论】:

          【解决方案4】:

          本网站列出了一些常用技术: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

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

          【讨论】:

            【解决方案5】:

            我猜你有一个类似于“cmets”表的东西,它本身有一个外键,指向每一行的父注释。这使得线程化的 cmets 变成了一个以线程启动器为树根的树形结构。

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

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

            【讨论】:

              【解决方案6】:

              我猜你的问题是关于安排系统,这样你就不必像这样工作了:

              1. 选择所有* cmets
              2. 选择在前一步中找到其父级的所有 cmets
              3. 选择在前一步中找到其父级的所有 cmets
              4. ...重复直到找不到 cmets

              我建议使用线程键来设计数据库表,该线程键将是该帖子所有父级的字符串。您必须将讨论限制在一定深度,但您的 sql 语句将是直接选择并按线程键排序,从而为您提供线程化 cmets。减少对数据库和 Web 服务器的负担。

              线程键类似于它的当前帖子 ID,它使用分隔符连接到它的父线程键。

              听起来怎么样?

              【讨论】:

                【解决方案7】:

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

                【讨论】:

                  最近更新 更多