2011-04-29 82 views
1
CREATE TABLE record (
    id INT PRIMARY KEY, 
    parent_id INT, 
    count INT NOT NULL 
) 

我有一个如上定义的表。字段'parent_id'是指行的父级,所以整个数据看起来像n元树。递归更新MySQL中的父行

根据我的业务逻辑,当一个行的字段'count'被请求增加时(例如一个),所有的祖先节点(或行)应该被更新以增加'count '领域也是如此。由于这个'count'字段预计会经常更新(比如1000/sec),所以我相信这个递归更新会由于DBMS中的巨大级联写入操作而大幅降低整个系统的性能。

现在,我认为存储过程是我可以选择的最佳选择。如果MySQL支持像Oracle的“连接”那样的操作,那么可能会有一些棘手的方法,但它显然不是。

是否有任何有效的方法来实现这一点?

在此先感谢。

+0

也许,如果你更经常地写更多的读,你不应该更新父母。相反,只要读取计算?如果将数据结构更改为[嵌套集模型](http://dev.mysql.com/tech-resources/articles/hierarchical-data.html),这可能有助于在SELECT中进行计算。 – pintxo 2011-04-29 08:14:14

+0

@ user730685请使用'{}'按钮输入源代码。如果这次为你做了这个。 – Oswald 2011-04-29 08:16:32

+0

@cmmi这应该是一个答案,而不是评论。 – Oswald 2011-04-29 08:41:26

回答

1

当您使用存储过程时,您仍然需要递归。您只能将源代码的递归移动到数据库。

您可以使用nested sets来存储分层数据。基本上,您创建了两个附加字段leftright,其中left < right。那么节点e1是节点e2的下属iff e1.left > e2.left && e1.right < e2.right

这消除了以更高成本价格插入,删除和重新定位节点的递归。另一方面,像你所描述的节点内容的更新可以在单个查询中完成。这很有效,因为可以使用索引在单个查询中检索节点及其所有祖先。