新聞蓋樓問題數據庫表設計的一些思考

問題現象

一個新聞下面可以有評論,其他人可以對評論進行回覆,還可以對回覆進行回覆。例如
但是對回覆的回覆一般無論回覆多少層,都是並列顯示的,只不過引用被回覆的內容。

這種結構不完全是樹形結構,基本上只有上下兩級,一級評論,二級回覆。(例如有時候我們會看到一條對評論的回覆,但是下面引用的內容顯示該評論已刪除),這種情況不,對於一級評論,刪除的時候,下面的回覆是級聯刪除的,但是對於二級評論,只刪除當前這條。

如果需要回復的結構真像蓋樓一樣,一層一層的樹形結構,那就需要閉包表建立完整的祖先和子孫的關係。不過當前常見的產品並沒有這麼做,例如網易雲音樂的回覆,抖音的回覆功能等。

舉個例子

新聞標題: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

查詢過程

  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
  1. 所有下級評論
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  
  1. 設置一級評論的下級評論
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章