performance - 如何实现线程化评论?

标签 performance database-design comments query-optimization table-structure

我正在开发一个可以支持线程注释的 Web 应用程序。我需要能够根据收到的票数重新排列评论。 (与线程评论在 reddit 中的工作方式相同)

我很想听听 SO 社区关于如何做到这一点的意见。

我应该如何设计 评论 table ?
这是我现在使用的结构:

Comment
    id
    parent_post
    parent_comment
    author
    points

这种结构应该做哪些改变?

我应该如何从这个表中获取详细信息以正确的方式显示它们?
(欢迎以任何语言实现。我只想知道如何以最好的方式做到这一点)

在实现此功能时我需要注意哪些事项以减少 CPU/数据库的负载?

提前致谢。

最佳答案

在数据库中存储树是一个有许多不同解决方案的主题。这取决于您是否还想检索子层次结构(因此项目 X 的​​所有子项),或者您是否只想获取整个层次结构集并使用字典以 O(n) 方式在内存中构建树。

您的表格的优势在于,您可以通过过滤父帖子,一次性获取对帖子的所有评论。当您以教科书/天真的方式定义了评论的父级时,您必须在内存中构建树(见下文)。如果你想从数据库中获取树,你需要一种不同的方式来存储树:
在此处查看我对基于预计算的方法的描述:
http://www.llblgen.com/tinyforum/GotoMessage.aspx?MessageID=17746&ThreadID=3208
或通过 using balanced trees described by CELKO here :

或另一种方法:
http://www.sqlteam.com/article/more-trees-hierarchies-in-sql

如果您在内存中获取层次结构中的所有内容并在那里构建树,则由于查询非常简单,因此效率会更高: select .. from Comment where ParentPost = @id ORDER BY ParentComment ASC

在该查询之后,您只使用 1 个字典在内存中构建树,该字典跟踪元组 CommentID - Comment。您现在遍历结果集并动态构建树:您遇到的每个评论,您都可以在字典中查找其父评论,然后将当前处理的评论也存储在该字典中。

关于performance - 如何实现线程化评论?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/597882/

相关文章:

javascript - 在 javascript 中更新 vscode 注释

javascript - 评论会影响性能吗?

java - 我在 ideone 中获得了很好的结果,但 SPOJ 不接受我的解决方案。链接如下

c++ - 用于快速插入和查找n维实 vector 的适当容器(提供了初始基准测试)

design-patterns - 设计问题使用哪种模式

mysql - 是否可以使用 MySQL 的模型/架构进行复杂查询?

std::vector<Test> 与 std::vector<Test*> 的性能

java - Guava 中的不可变优先级队列

mysql - 创建非破坏性 mysql 查询,能够创建表或更新缺少字段的表

javascript - 将元素隐藏在具有类的元素内