Mysql邻接列表模型替代?

时间:2011-08-23 15:43:48

标签: php mysql sql database-design

我在MySQL中使用了我的表的邻接列表模型,以及用于查询的PHP函数递归,并意识到它减慢了网站的速度。有没有我可以使用的替代模型,我可以使用一个查询来获取父元素和子元素,而不递归?

表结构如下:

    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);
}

}

3 个答案:

答案 0 :(得分:2)

您可以使用嵌套集方法。

http://en.wikipedia.org/wiki/Nested_set_model中查看更多信息 和Move node in nested set

答案 1 :(得分:2)

您在表中存储了多少条记录?嵌套集肯定更快,但表结构非常精致。如果它破裂,修复表结构是非常具有挑战性的,它通常需要人工干预。

如果您只有几百条记录,那么使用Adjacency方法可能会更好。如果你正在谈论成千上万或记录,最好使用嵌套集,但要确保处理它的代码是100%防弹或你的表将像Humpty Dumpty。

虽然邻接列表效率低下,但有一些方法可以有效地使用它们。我写了一个类来轻松处理Adjacency列表。你可以从这里下载:

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

答案 2 :(得分:0)

如果您多次递归查询数据库(显然是这种情况),则会出现性能问题。

您可以做的是一次查询所有数据,然后让PHP递归地处理/组织项目。你应该没问题。