4

似乎有几个很好的选择来表示数据库中的分层数据,最流行的显然是树遍历算法。

在我的情况下可能可行的另一个选择是递归地进行。这可能涉及保存父 ID 并从那里开始 - 尽管这也需要某种方向。

现在我有一个问题,我有一组可以通过连接图来表征的项目,但是没有根,也不一定是起点。例如,可能会发生项目围绕自身循环,因此排序只是每个元素的元素而不是完整的。排序是“父”还是“子”取决于您从哪个方向开始,可以这么说。
此外,每个连接都应该由几个属性来表征,因此需要以某种方式识别连接。
例子

另一件事是我仅限于 Access,这意味着我几乎仅限于您的标准 SQL 命令,而没有 SQL 中的递归或函数。
例如,SQL 中的许多动态转换为左/右遍历树的算法不适用于 Access SQL。
我对解决这个问题有很大的兴趣,而不是过多地依赖 VBA。

就性能而言,我预计少于 5000 个项目,尽管有关元素属性及其连接的查询可能有数十个元素。最初,该数据库将被少于 10 个用户同时使用,尽管如果它们运行良好,这些东西往往会在这里迅速扩展。

那么,你将如何实现这个结构呢?

4

1 回答 1

1

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

一种更灵活的方法,我建议您使用的方法是 Bill Karwin 所说的闭包表

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

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

  1. 节点A
  2. 节点B
  3. 酒花

以下是图表的一些示例数据:

NodeA   NodeB  Hops
------  ------ ----
tog171  tog171  0
tog171  abb521  1
abb521  tog171  1
tog171  tog226  2
tog226  tog171  2
tog171  tog218  3
tog218  tog171  3

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

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

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

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

于 2013-01-25T15:16:53.673 回答