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