问题现象
一个新闻下面可以有评论,其他人可以对评论进行回复,还可以对回复进行回复。例如
但是对回复的回复一般无论回复多少层,都是并列显示的,只不过引用被回复的内容。
这种结构不完全是树形结构,基本上只有上下两级,一级评论,二级回复。(例如有时候我们会看到一条对评论的回复,但是下面引用的内容显示该评论已删除),这种情况不,对于一级评论,删除的时候,下面的回复是级联删除的,但是对于二级评论,只删除当前这条。
如果需要回复的结构真像盖楼一样,一层一层的树形结构,那就需要闭包表建立完整的祖先和子孙的关系。不过当前常见的产品并没有这么做,例如网易云音乐的回复,抖音的回复功能等。
举个例子
新闻标题:XXXX
A: 这个新闻说的好。
B: 我觉得不好。
A: 呵呵。
@B: 我觉得不好。
B: 呵呵哒。
@A: 呵呵。
C: 那是你有问题。
@B: 我觉得不好。
D: 我也觉得说的好。
E: +1
回复表comments, 按时间先后顺序保存入表:
ID | NEWS_ID | USER_ID | COMMENT |
---|---|---|---|
1 | 1 | A | 这个新闻说的好。 |
2 | 1 | B | 我觉得不好。 |
3 | 1 | D | 我也觉得说的好。 |
4 | 1 | A | 呵呵。 |
5 | 1 | B | 呵呵哒。 |
6 | 1 | C | 那是你有问题。 |
7 | 1 | E | +1 |
回复关系闭包表relations:
ID | COMMENT_ID | REPLY_COMMENT_ID | ANCESTOR_COMMENT_ID | NEWS_ID |
---|---|---|---|---|
1 | 1 | 1 | ||
2 | 2 | 1 | 1 | 1 |
3 | 3 | 1 | ||
4 | 4 | 2 | 1 | 1 |
5 | 5 | 4 | 1 | 1 |
6 | 6 | 2 | 1 | 1 |
7 | 7 | 3 | 3 | 1 |
查询过程
- 查找所有一级评论
select c.id, c.user_id, c.comment from comments
right join relations r on c.id = r.comment_id
where news_id = 1 and r.ANCESTOR_COMMENT_ID is null
- 所有下级评论
select r.ANCESTOR_COMMENT_ID, c.user_id, c.comment from comments
right join relations r on c.id = r.comment_id
where r.ANCESTOR_COMMENT_ID in (...) order by create_time desc
- 设置一级评论的下级评论