我正在开发一个可以支持线程注释的 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/