8

在关系数据库中保存复合模式的“最佳实践”是什么?

我们一直在使用改进的预序树遍历。构建整个树非常快,但插入或删除新节点非常慢(所有左右值都需要调整)。查询一个节点的子节点也不容易而且很慢。

我们注意到的另一件事是,您确实必须确保树不会弄乱。您需要事务锁,否则左右值可能会损坏,修复损坏的左右树并非易事。

但是,Modified Preorder Tree Traversal 确实工作得很好,但我想知道是否有更好的选择。

4

2 回答 2

6

虽然使用 MPTT 查找行的所有后代很快,但查找所有子代可能很慢。但是,您应该能够通过向parent_id表中添加一个记录(是的,冗余)行的父级的字段来解决此问题。那么搜索就变成了:

SELECT *
FROM tbl
WHERE parent_id = z

是的,parent_id包含冗余信息,可能会使您的表非规范化——但由于任何插入/更新/删除都需要全局更改,因此保持parent_id最新并不需要额外支付太多费用。您也可以使用level记录行的垂直级别的字段,尽管实际上这在某些类型的转换下可能发生变化(例如,将子树移动到树中的不同点)。

对于插入/更新繁重的工作负载,普通的旧链接到父表示(即只有parent_id没有left_posor )当然更快,但它可以有效回答的唯一查询是“查找 X 的父级”和“查找right_posX的孩子。” 大多数工作负载涉及比写入更多的阅读,因此通常 MPTT 总体上更快 - 但也许在您的情况下,您需要考虑移动(“返回”)到链接到父级?

于 2009-03-29T17:08:09.747 回答
0

我听说在数据库中存储分层数据的最佳方法是使用字符串属性,其中内容是用冒号分隔的父级列表。

于 2009-03-29T17:08:20.633 回答