2008-08-30 117 views

回答

0

我在這種情況下通常會做的是讓一個線程負責將數據放入數據庫,並讓所有輔助線程向該線程報告,然後將該數據排隊,然後將其寫入串行,或分批(取決於需求,以及我願意忍受多少數據庫活動)。

1

我猜你的問題是關於安排系統,讓您不必上班:

  1. 選擇所有的頂級評論
  2. 選擇他們的父母在步驟發現所有評論之前
  3. 選擇他們的父母在之前
  4. 步驟發現所有評論...重複,直到沒有評論發現

我會建議使用一個線程鍵設計數據庫表,這將是該職位的所有父母的字符串。你必須限制你的討論到一定的深度,但是你的sql語句應該是直接選擇和按線程鍵排序,給你回線程註釋。對您的數據庫和Web服務器徵稅較少。

一個線程鍵會像它的當前職位ID加入到它的父母的線程鍵與分隔符。

這聽起來怎麼樣?

0

我猜你有類似「評論」表的東西,有一個外鍵自己,指向每行的父註釋。這使得線程註釋成爲以線程啓動器作爲樹根的樹結構。

所以我們可以將這個問題改爲「從數據庫中選擇樹結構的最佳方法是什麼?」。那麼我不會假設知道最好的方式,但是我的第一個傾向(可能是錯誤的)是使用存儲過程來遍歷樹,並編譯要返回的行列表。它仍然需要多個選擇語句來獲取所有的孩子,但它只是一次數據庫往返。

Aryeh的方法與積累父列表可能是更好:)

1

SELECT ... START WITH ... CONNECT BY

Oracle有一個擴展選擇,允許輕鬆基於樹的檢索。

這個查詢將穿越其中的嵌套關​​系存儲在孩子列的表。

select * from my_table 
    start with parent = :TOP_ARTICLE 
    connect by prior child = parent; 

http://www.adp-gmbh.ch/ora/sql/connect_by.html

4

Modified pre-order tree traversal(或什麼馬特提到的 「嵌套組」)是要走的路。

如果你碰巧在Django工作,那麼有一個第三方應用django-mptt,這使得在你的模型中實現MPTT是一個單線程。

0

我不得不第二次卡爾邁爾的建議,使用link text技術。我現在正在研究這樣一個系統,但是對於論壇還有一些進一步的優化。

在支持回覆的論壇系統中,您經常會插入樹中間,從而導致性能下降。爲了減少我正在努力讓數字線上的空白的痛苦。這工作就像在數組列表中預先分配內存。向右移動樹的成本對於1和100是相同的。因此,在連續回覆(更有可能)時,我可以更新更少的樹節點,並且它們將更快。

縮小規模是通過比較當前節點的左右值來中斷後代節點的計數(本帖下面的回覆數)。這些信息可以緩存在數據結構中以實現快速。所以在插入時,我將不得不用新計數來更新所有的祖先節點。更少的節點將被更新,結果將會大大加快平均情況下的插入時間。

多棵樹被存儲在同一個表中。每棵樹都有一個唯一的樹ID,每個主題一個。更小的樹更新更快。

希望幫助