Insert/update 在 MySQL 中存储分层数据的有效解决方案?
Insert/update efficient solution to store hierarchical data in MySQL?
我了解在关系数据库中存储分层数据有多种模式,例如使用邻接列表、嵌套集等。
但是,嵌套集之类的缺点是,如果您经常需要按 adding/removing children 更新节点,则更新其余 [=30] 的成本很高=].
如以下示例的场景有什么解决方案:
(Parent1)
/ | \
(Child1) (Child2) (Child3)
/ |
[Child1a, Child1b][Child2a]
经常需要更新到:
(Parent1)
/ | \
(Child1) (Child4) (Child5)
/ | \
[Child1a, Child1b][Child4a] [Child5a]
等等
我的数据将最多嵌套 3 层,但想法是解决方案应该支持存储在 table 中的许多这种小树,并且 children 可以是 updated/modified以高效的方式。
就存储和更新的复杂性而言,存储分层数据的成本最低的方法是邻接表。
- 定义 child 的 parent 正好更新 1 行
- 将 child 移动到新的 parent 正好更新 1 行
- 删除N个节点的子树就是删除N行
- 添加N个节点的子树就是插入N行
嵌套集或路径枚举或闭包等其他技术 Table 需要更复杂的更新,但权衡是这些技术支持 arbitrary-depth 操作而无需递归查询语法。
如果你能保证树的深度永远不会超过三层,你就可以通过几个简单的外部连接对邻接表进行许多操作。
请注意 MySQL 8.0 is implementing recursive query syntax,因此将来可能不再需要变通技术。
我了解在关系数据库中存储分层数据有多种模式,例如使用邻接列表、嵌套集等。
但是,嵌套集之类的缺点是,如果您经常需要按 adding/removing children 更新节点,则更新其余 [=30] 的成本很高=].
如以下示例的场景有什么解决方案:
(Parent1)
/ | \
(Child1) (Child2) (Child3)
/ |
[Child1a, Child1b][Child2a]
经常需要更新到:
(Parent1)
/ | \
(Child1) (Child4) (Child5)
/ | \
[Child1a, Child1b][Child4a] [Child5a]
等等
我的数据将最多嵌套 3 层,但想法是解决方案应该支持存储在 table 中的许多这种小树,并且 children 可以是 updated/modified以高效的方式。
就存储和更新的复杂性而言,存储分层数据的成本最低的方法是邻接表。
- 定义 child 的 parent 正好更新 1 行
- 将 child 移动到新的 parent 正好更新 1 行
- 删除N个节点的子树就是删除N行
- 添加N个节点的子树就是插入N行
嵌套集或路径枚举或闭包等其他技术 Table 需要更复杂的更新,但权衡是这些技术支持 arbitrary-depth 操作而无需递归查询语法。
如果你能保证树的深度永远不会超过三层,你就可以通过几个简单的外部连接对邻接表进行许多操作。
请注意 MySQL 8.0 is implementing recursive query syntax,因此将来可能不再需要变通技术。