問題現象
一個新聞下面可以有評論,其他人可以對評論進行回覆,還可以對回覆進行回覆。例如
但是對回覆的回覆一般無論回覆多少層,都是並列顯示的,只不過引用被回覆的內容。
這種結構不完全是樹形結構,基本上只有上下兩級,一級評論,二級回覆。(例如有時候我們會看到一條對評論的回覆,但是下面引用的內容顯示該評論已刪除),這種情況不,對於一級評論,刪除的時候,下面的回覆是級聯刪除的,但是對於二級評論,只刪除當前這條。
如果需要回復的結構真像蓋樓一樣,一層一層的樹形結構,那就需要閉包表建立完整的祖先和子孫的關係。不過當前常見的產品並沒有這麼做,例如網易雲音樂的回覆,抖音的回覆功能等。
舉個例子
新聞標題: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
- 設置一級評論的下級評論