gpt4 book ai didi

sql - 在数据库中表示无根树/图表/层次结构

转载 作者:行者123 更新时间:2023-12-04 14:09:28 24 4
gpt4 key购买 nike

似乎有几个很好的选择来表示数据库中的分层数据,最流行的显然是树遍历算法。
在我的情况下可能可行的另一个选择是递归地进行。这可能涉及保存父 ID 并从那里开始 - 尽管这也需要某种方向。
现在我有一个问题,我有一组可以通过连接图来表征的项目,但是没有根,也不一定是起点。例如,可能会发生项目围绕自身循环,因此排序只是每个元素的元素而不是完整的。排序是“父”还是“子”取决于您从哪个方向开始,可以这么说。
此外,每个连接都应该由几个属性来表征,因此需要以某种方式识别连接。
这是一个示例,虽然请注意这只是一个小示例,但您已经可以看到一个简单的遍历算法可能从 254 开始,但是从 203 到 162 然后 254 实际上是 162 的子节点 - 这可能是一个问题(我我远不是一个 cs 专业,所以我真的不知道)
example
另一件事是我仅限于 Access,这意味着我几乎仅限于您的标准 SQL 命令,而没有 SQL 中的递归或函数。
例如,SQL 中的许多动态转换为左/右遍历树的算法不适用于 Access SQL。
我对解决这个问题有很大的兴趣,而不是过多地依赖 VBA。
就性能而言,我预计少于 5000 个项目,尽管有关元素属性及其连接的查询可能有数十个元素。最初,该数据库将被少于 10 个用户同时使用,尽管如果它们运行良好,这些东西往往会在这里迅速扩展。
那么,你将如何实现这个结构呢?

最佳答案

我使用了 Joe Celko 的嵌套集合方法。它在正确的情况下工作得非常好。这不是其中一种情况。

一种更灵活的方法,我建议您使用的方法是 Bill Karwin 所说的 closure table .

基本思想是您有一条记录 可能的路径。 Bill 建议使用两个字段,ancest_id 和 descendant_id。从您的图表中不清楚祖先/后代范式是否真的适用于您的情况。

我还发现为节点之间的跳数添加至少一个字段很有用。我会通过创建一个包含三个字段的表来调整 Bill 的方法:

  • 节点A
  • 节点B
  • 啤酒花

  • 以下是图表的一些示例数据:
    NodeA   NodeB  Hops
    ------ ------ ----
    tog171 tog171 0
    tog171 abb521 1
    abb521 tog171 1
    tog171 tog226 2
    tog226 tog171 2
    tog171 tog218 3
    tog218 tog171 3

    如果不同颜色的线和实线与虚线有一些语义含义,则还可以将捕获该语义含义的附加字段添加到您的表中。

    您的表格中确实有很多条目,但灵 active 几乎是无限的。在查看您的图表时,灵 active 似乎是您最大的需求。

    编辑 : 我的样本数据中的第一行 0 跳实际上是我从 PJ Eby 在他的博客文章 The simplest(?) way to do tree-based queries in SQL 中学到的一种技术.这些节点的目的是使节点的插入和删除更简单。我强烈推荐该页面以详细了解实现闭包表。

    我认为 PJ Eby 的页面实际上是写入闭包表的更好资源,而 Bill Karwin 的回答有一些从表中读取的很好的例子。

    关于sql - 在数据库中表示无根树/图表/层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14518549/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com