需求是获取文章下的评论以及评论的回复
大概形式是这样
A:这是一条评论
B:这是评论的回复
回复B:这是评论的回复的回复
回复C:这是评论的回复的回复的回复
然后之前的做法是:
先select出评论
在foreach评论逐条select出评论的所有回复,再按时间排序,归类到评论的子集中
但是一旦评论多了之后就会出现性能瓶颈,如何科学高效地拿到这个评论和回复的集合?包括数据表如何设计和代码的逻辑,求大神赐教。
补充:表的结构可以修改,我想知道科学一点的表一般是怎么设计的?或者说如何设计这个表能够最大程度提高性能
再补充:还有一个问题,就是如果我只需要获得单个评论下的三条回复内容,以及单个评论下所有回复的数量,又该怎么处理这个逻辑或者说sql怎么写呢?
回答
可以加一个字段depth 比如1-3-5;
首先查评论肯定是要分页的每页数量可控。每一条再根据这个depth查询他的回复评论。这样可以减少查库次数,效率会好一些
评论其实是一个树形的结构,可以用两个字段标识:
response_id // 回复的评论id
root_response_id // 回复的最根级评论
查询的时候先查response_id为空的记录即根级目录(比如查出每页5条或者10条),再来一个IN查询,总共2次。
我也是觉得加个depth 类似这么前提 维护好这个字段
我觉得用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;
}
先查询文章的所有父级评论,不查子评论。
等到用户点击查看某个评论的子评论的时候,再传这个评论的id作为子评论的父级id查询下去。
而且,评论不要做成无限循环嵌套的方式。
像 segmentfault 这里,你评论我的这个回复之后,不点击左下角的“评论”,你是看不到别人对我的评论的。