Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 表示数据库中的无根树/图表/层次结构_Sql_Ms Access_Database Design_Relational Database - Fatal编程技术网

Sql 表示数据库中的无根树/图表/层次结构

Sql 表示数据库中的无根树/图表/层次结构,sql,ms-access,database-design,relational-database,Sql,Ms Access,Database Design,Relational Database,在数据库中表示分层数据似乎有几个好的选择,最流行的显然是树遍历算法 在我的例子中,另一个可能有效的选择是递归地进行。这可能需要保存父id并从那里开始——尽管这也需要某种指导 现在我有一个问题,我有一组可以用连接图来描述的项目,但是没有根,也不一定是起点。例如,项目可能会围绕自身循环,因此每个元素的顺序仅为元素,而不是完整的。顺序是“父”还是“子”取决于您从哪个方向开始,也就是说。 此外,每个连接都应该具有几个属性,因此连接需要以某种方式识别。 这里有一个例子,但请注意,这只是一个小例子,但您已经

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

在我的例子中,另一个可能有效的选择是递归地进行。这可能需要保存父id并从那里开始——尽管这也需要某种指导

现在我有一个问题,我有一组可以用连接图来描述的项目,但是没有根,也不一定是起点。例如,项目可能会围绕自身循环,因此每个元素的顺序仅为元素,而不是完整的。顺序是“父”还是“子”取决于您从哪个方向开始,也就是说。
此外,每个连接都应该具有几个属性,因此连接需要以某种方式识别。
这里有一个例子,但请注意,这只是一个小例子,但您已经看到,一个简单的遍历算法可能从254开始,但从203到162,那么254实际上是162的孩子-这可能是一个问题(我远没有学cs专业,所以我真的不知道)

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

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


那么,您将如何实现这个构造呢?

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

比尔·卡温(Bill Karwin)称之为,这是一种更灵活的方法,我建议您使用

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

我还发现,为节点之间的跳数添加至少一个字段是有用的。我将修改Bill的方法,创建一个包含三个字段的表:

  • 诺迪亚
  • 节点
  • 啤酒花
  • 以下是图表的一些示例数据:

    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的博客文章中从他那里学到的一种技术。这些节点的目的是简化节点的插入和删除。我强烈建议在这一页中详细介绍如何实现闭包表


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

    我承认我没有详细研究过你的问题。然而,你读过Joe Celko的嵌套集吗?可能会给你一些想法。我读过那个网站,是的。我知道他有一本我没有的书。也许我完全错了,但我相信我的交易会遇到麻烦,因为元素的顺序是多么的不确定。那么(通过算法)将图表分割成可以通过树遍历呈现的部分的方向呢?一定有办法保存这些信息。我的意思是,我可以做一个常规的n:n类型的关系表,但是我仍然需要一个算法来输出任何一个元素的相关连接。这是一个树还是一个web?在我看来它是多路径的。
    。。。排序是“父”还是“子”取决于您从哪个方向开始…
    ——因此它不是一个有向图;因此,既不是树也不是层次。从这里开始,我将尝试让它在纯access sql中工作,但这是Bill第二次间接地给我db建议-所以我会买他的书;)不管怎样,这就是我一直在寻找的。非常感谢。mwolfe02@IMA:我刚刚添加了一个链接,指向另一篇关于实现闭包表的博客文章。我认为这实际上比Karwin的答案更好。