在关系数据库中保存复合模式的“最佳实践”是什么?
我们一直在使用改进的预序树遍历。构建整个树非常快,但插入或删除新节点非常慢(所有左右值都需要调整)。查询一个节点的子节点也不容易而且很慢。
我们注意到的另一件事是,您确实必须确保树不会弄乱。您需要事务锁,否则左右值可能会损坏,修复损坏的左右树并非易事。
但是,Modified Preorder Tree Traversal 确实工作得很好,但我想知道是否有更好的选择。
在关系数据库中保存复合模式的“最佳实践”是什么?
我们一直在使用改进的预序树遍历。构建整个树非常快,但插入或删除新节点非常慢(所有左右值都需要调整)。查询一个节点的子节点也不容易而且很慢。
我们注意到的另一件事是,您确实必须确保树不会弄乱。您需要事务锁,否则左右值可能会损坏,修复损坏的左右树并非易事。
但是,Modified Preorder Tree Traversal 确实工作得很好,但我想知道是否有更好的选择。
虽然使用 MPTT 查找行的所有后代很快,但查找所有子代可能很慢。但是,您应该能够通过向parent_id
表中添加一个记录(是的,冗余)行的父级的字段来解决此问题。那么搜索就变成了:
SELECT *
FROM tbl
WHERE parent_id = z
是的,parent_id
包含冗余信息,可能会使您的表非规范化——但由于任何插入/更新/删除都需要全局更改,因此保持parent_id
最新并不需要额外支付太多费用。您也可以使用level
记录行的垂直级别的字段,尽管实际上这在某些类型的转换下更可能发生变化(例如,将子树移动到树中的不同点)。
对于插入/更新繁重的工作负载,普通的旧链接到父表示(即只有parent_id
没有left_pos
or )当然更快,但它可以有效回答的唯一查询是“查找 X 的父级”和“查找right_pos
X的孩子。” 大多数工作负载涉及比写入更多的阅读,因此通常 MPTT 总体上更快 - 但也许在您的情况下,您需要考虑移动(“返回”)到链接到父级?
我听说在数据库中存储分层数据的最佳方法是使用字符串属性,其中内容是用冒号分隔的父级列表。