MySQL中父行的递归更新

时间:2011-04-29 08:09:43

标签: mysql recursion

CREATE TABLE record (
  id INT PRIMARY KEY,
  parent_id INT,
  count INT NOT NULL
)

我有一个如上定义的表格。字段'parent_id'指的是行的父级,因此整个数据看起来像n-ary树。

根据我的业务逻辑,当请求一行的字段'count'递增时(例如,一个),应该更新所有祖先节点(或行)以增加'count'也是一个领域。

由于这个'count'字段预计会频繁更新(比如1000 / sec),我相信这种递归更新会因为DBMS中的大量级联写操作而导致整个系统变慢。

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

有没有有效的方法来实现这个?

提前致谢。

1 个答案:

答案 0 :(得分:1)

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

您可以使用nested sets存储分层数据。基本上,您创建了两个其他字段leftright left < right。然后,节点e1从属于e2 iff e1.left > e2.left && e1.right < e2.right的下级。

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