就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果你觉得这个问题可以改进并可能重新打开,visit the help center 寻求指导。




9年前关闭。




"put a FK to your parent" method ,即每个记录都指向它的父级。
这对于读取操作来说很难,但很容易维护。

然后还有一个“目录结构键”方法:

0001.0000.0000.0000 main branch 1
0001.0001.0000.0000 child of main branch one
etc

这是 super 容易阅读,但很难维护。
其他方式及其优缺点是什么?

最佳答案

一如既往:没有最佳解决方案。每个解决方案都会使不同的事情变得更容易或更难。适合您的解决方案取决于您最常执行的操作。
带有父 ID 的天真方法:
优点:

  • 易于实现
  • 轻松将大子树移动到另一个父级
  • 插入物便宜
  • SQL 中可直接访问的所需字段

  • 缺点:
  • 检索整棵树是递归的,因此开销很大
  • 查找所有 parent 也很昂贵(SQL 不知道递归......)

  • 修改前序树遍历(保存起点和终点):
    优点:
  • 检索整棵树既简单又便宜
  • 找到所有的 parent 很便宜
  • SQL 中可直接访问的所需字段
  • 奖励:您也在其父节点中保存子节点的顺序

  • 缺点:
  • 插入/更新可能非常昂贵,因为您可能需要更新很多节点

  • 每个节点保存一条路径:
    优点:
  • 找到所有的 parent 很便宜
  • 检索整棵树很便宜
  • 插入便宜

  • 缺点:
  • 移动整棵树很昂贵
  • 根据您保存路径的方式,您将无法直接在 SQL 中使用它,因此如果您想更改它,您将始终需要获取并解析它。

  • 闭合表
    优点:
  • 易于实现
  • 找到所有的 parent 很便宜
  • 插入便宜
  • 检索整棵树很便宜

  • 缺点:
  • 需要额外的表
  • 与其他方式相比占用大量空间
  • 移动子树很昂贵

  • 我更喜欢最后两个中的一个,具体取决于数据更改的频率。
    另见:http://media.pragprog.com/titles/bksqla/trees.pdf

    关于mysql - 在关系数据库中存储树结构的已知方法有哪些?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3362669/

    10-14 20:30
    查看更多