2012-08-16 190 views
0

我有一個評論系統,我設計的,它的工作沒有任何嵌套。現在,我想讓人們直接回複評論,而不是該頁面上的一般內容。所以我想在我的數據庫中添加一個父指向父指針的列。嵌套評論系統sql

現在,下一步(其中我發現一個很好的方式去了解這個就吃問題)。是查詢數據庫的所有評論(嵌套和不是)所有基於其共同的「事件ID」,然後以正確的順序顯示它們,以便嵌套評論正確地連接到他們的父母...有沒有任何有效的方法將所有這些註釋都排序在一起,這樣我就不必開始用遞歸和東西來做奇怪的查詢調用了?所有評論還有一些時間戳以及其他一些不相關的數據。

感謝您的任何建議

+0

Easyest方法是使用兩個查詢。首先查詢你選擇所有的父母,並在第二個孩子。或者一次選擇它們,並將它們放入一個parent_id作爲關鍵字的數組中。 – 2012-08-16 06:16:11

+0

我知道這可能不是一個實際的選擇,但它仍然是值得思考的:這對於[像MongoDB這樣的面向文檔的數據庫](http://en.wikipedia.org/wiki/MongoDB)來說似乎是一個很好的用例, 。您可以將所有評論存儲在帖子中,然後對該評論中的每條評論嵌套評論。查詢所有發佈的數據與獲取文檔一樣簡單 - 無需連接!但是,您的其餘設計可能無法與MongoDB一起使用。但是,正如我所說,這是一件有趣的事情要考慮。 – DaoWen 2012-08-16 06:25:34

+0

如果嵌套可以是任何深度的級別,則可能無法避免某種類型的遞歸。如果您對PHP更熟悉,則可以對從MySQL獲取的數組進行遞歸。 – dezso 2012-08-16 06:36:45

回答

3

有一個叫「嵌套集合」的概念。基本上,每條評論和文章都有兩列,分別指定其子項目的「開始」和「結束」。每個評論的開始和結束都完全在父項目的集合內,並且兄弟之間沒有重疊 - 兩個集合重疊的唯一時間是當一個完全在另一個內部時(即:如果一個項目是另一個)。

        Article 
          /-----(1, 12)----\ 
         Comment     Comment 
        /---(2, 5)    /--(6, 11)--\ 
      Comment     Comment  Comment 
      (3, 4)      (7, 8)   (9, 10) 

當你在一個特定的項目查詢,您可以尋找具有匹配的文章ID,其設置是您的項目組內的每一個項目。這會檢索所有的孩子,以及他們所有的孩子,等等。按開始或結束對它們進行排序,並且評論應該甚至大部分按順序出現 - 並且您可以與另一個端點進行比較,以確定其中一個是否是另一個的子項目。 (如果您是通過啓動排序,這個項目的結束小於前一個的,那麼你有一個分項目。)

缺點是,每個留言需要更新這些設置。這很簡單,但可能非常慢。例如:爲了在(7,8)下添加另一個項目,例如:

  • 對於那篇文章,更新每個'end'> = 8加入2。
  • 對於該文章,通過添加2更新每個「開始」> 8。
  • 插入新項目,並帶有一組(8,9)。

你有越多的意見「之後的」一個你插入,當然,越慢的更新會。

保持on..lemme谷歌...

http://en.wikipedia.org/wiki/Nested_set_model