2011-08-23 56 views
1

我在MySQL中使用了我的表的鄰接表模型,以及一個PHP函數遞歸查詢,並意識到它減慢了網站。有沒有另一種模式,我可以使用,我可以使用一個查詢來獲得父和子元素,而不遞歸?Mysql鄰接列表模型的替代?

表結構是這樣的:

myTable: 
+----+----------+ 
| id | parentID | 
+----+----------+ 
| 1 |  null | 
| 2 |  1 | 
| 3 |  1 | 
| 4 |  2 | 
| 5 |  4 | 
----------------- 

我使用的是遞歸查詢象下面這樣:

function queryf($id) { 

$query = mysql_query("SELECT * FROM `Table` WHERE id='$id'",$this->connect); 
while($row = mysql_fetch_assoc($query)) { 

$sid = $row['id']; 
//code 
$this->$queryf($sid); 
} 

} 
+0

你必須讓我們知道你是如何「使用遞歸」把事情做好,這樣你可以得到更多有用的答案 –

+0

可能重複[遞歸的自我查詢] (http://stackoverflow.com/questions/3276136/recursive-self-query) –

+0

可能重複的[MySQL - 最好的方法來處理這種分層數據?](http://stackoverflow.com/questions/3137674/mysql-最好的方法來處理這個分層數據) – outis

回答

0

如果你是遞歸DB多次查詢(這顯然是這樣的),你將會遇到性能問題。

你可以做的是一次查詢所有數據,然後讓PHP以遞歸方式處理/組織項目。你應該沒問題。

2

更多信息多少條記錄你在表中存儲?嵌套組肯定會更快,但桌子結構非常微妙。如果發生故障,修理表格結構非常具有挑戰性,並且通常需要人工干預。

如果您只有幾百條記錄,那麼使用Adjacency方法可能會更好。如果你正在談論成千上萬或記錄,肯定用嵌套集合更好,但要確保處理它的代碼是100%防彈的,否則你的表就像Humpty Dumpty。

雖然鄰接列表效率低下,但有些方法可以有效地使用它們。我編寫了一個輕鬆處理鄰接列表的類。你可以從這裏下載:

http://www.pdvictor.com/en/?sv=&category=just%20code&title=adjacency%20model

+0

+1「嵌套套餐...表格結構非常微妙如果打破,固定表格結構非常具有挑戰性,並且通常需要人工干預。」 –