设计线程注释系统

时间:2020-03-05 18:45:33  来源:igfitidea点击:

设计线程注释系统以免影响数据库的最佳方法是什么?

解决方案

回答

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

回答

我猜问题是关于安排系统,因此我们不必像这样工作:

  • 选择所有顶级评论
  • 选择在先前步骤中找到其父母的所有评论
  • 选择在先前步骤中找到其父母的所有评论
  • ...重复直到找不到评论

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

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

听上去怎么样?

回答

我猜我们有一些类似于"评论"表的东西,它本身带有外键,指向每一行的父注释。这使线程注释成为一个以线程启动器作为树根的树结构。

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

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

回答

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

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

回答

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

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

回答

修改后的预排序树遍历(或者Matt称为"嵌套集")是解决问题的方法。

如果我们碰巧是在Django中工作,则有一个第三方应用程序django-mptt,使在模型中实现MPTT成为一体。

回答

我必须第二次使用Carl Meyer的建议才能使用链接文本技术。我现在正在使用这样的系统,但是对论坛进行了一些进一步的优化。

在支持回复的论坛系统中,我们经常会在树的中间进行插入操作,从而导致性能下降。为了减轻痛苦,我正在努力在数字线上留出一些空白。这就像在数组列表中预分配内存一样。将树向右移动的代价对于1和100都是相同的。因此,在连续答复(更有可能)上,我可以更新较少的树节点,它们的速度将更快。

缩减是通过比较当前节点的左节点和右节点将中断的数量来计算后代节点(此帖子下方的回复数)。可以将这些信息缓存在数据结构中以加快速度。因此,在插入时,我将必须使用新计数更新所有祖先节点。仍然少得多的节点将被更新,结果是平均情况下插入时间要快得多。

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

希望有帮助