mysql如何检索评论和针对评论的回复

yachtxiao
  • 68

需求是获取文章下的评论以及评论的回复
大概形式是这样

A:这是一条评论

  • B:这是评论的回复
  • 回复B:这是评论的回复的回复
  • 回复C:这是评论的回复的回复的回复

然后之前的做法是:

  • 先select出评论
  • 在foreach评论逐条select出评论的所有回复,再按时间排序,归类到评论的子集中

但是一旦评论多了之后就会出现性能瓶颈,如何科学高效地拿到这个评论和回复的集合?包括数据表如何设计和代码的逻辑,求大神赐教。

补充:表的结构可以修改,我想知道科学一点的表一般是怎么设计的?或者说如何设计这个表能够最大程度提高性能

再补充:还有一个问题,就是如果我只需要获得单个评论下的三条回复内容,以及单个评论下所有回复的数量,又该怎么处理这个逻辑或者说sql怎么写呢?

回复
阅读 4.4k
5 个回答

可以加一个字段depth 比如1-3-5;
首先查评论肯定是要分页的每页数量可控。每一条再根据这个depth查询他的回复评论。这样可以减少查库次数,效率会好一些

评论其实是一个树形的结构,可以用两个字段标识:

response_id // 回复的评论id
root_response_id // 回复的最根级评论

查询的时候先查response_id为空的记录即根级目录(比如查出每页5条或者10条),再来一个IN查询,总共2次。

goper
  • 374

我觉得用Mysql直接把数据查询出来,数据库结构字段 id(主键),pid (父Id)
然后程序通过递归的方式把数据罗列出来。可以嵌套多层。
以下是php实现递归方式获取所有评论的信息。

树状无限极分类
function getTree($list,$id=0,$level=0) {
    static $tree = array();
    foreach($list as $row) {
        if($row['pid']==$id) {
            $row['level'] = $level;
            $row['name'] = str_repeat('----',$level). $row['name'];
            $tree[] = $row;
            $this->getTree($list, $row['id'], $level + 1);
        }
    }
    return $tree;
}
 
function getTree($list,$pid=0,$level=0) {
    static $tree = array();
    foreach($list as $row) {
        if($row['dept_pid']==$pid) {
            $row['dept_level'] = $level;
            $tree[] = $row;
            getTree($list, $row['dept_id'], $level + 1);
        }
    }
    return $tree;
}
皇虫
  • 2
新手上路,请多包涵

先查询文章的所有父级评论,不查子评论。

等到用户点击查看某个评论的子评论的时候,再传这个评论的id作为子评论的父级id查询下去。

而且,评论不要做成无限循环嵌套的方式。

像 segmentfault 这里,你评论我的这个回复之后,不点击左下角的“评论”,你是看不到别人对我的评论的。

我也是觉得加个depth 类似这么前提 维护好这个字段

宣传栏