树遍历以查找两个表之间最"合乎逻辑"的 SQL 连接



我正在创建一个类似报告生成器的应用程序,目的是制作一个对新手非常友好的前端。

应用程序的后端将由开发人员管理,他们可以构建一个"报表模型",该模型将指定要包含哪些表、字段和联接供最终用户使用。

我还希望添加不需要报表模型的功能。我的应用程序将扫描目标 SQL 数据库,并创建一个映射了所有联接和字段的虚拟模型。

在此之后,我需要能够在表之间生成最"合乎逻辑"或最有效的路径,例如使用最少数量的连接。有点类似于旅行推销员的场景。

我决定通过使用树来映射来自特定表(将成为开始节点)的所有连接,以及它可能连接到的所有其他表。通过这种方式,我可以进行广度优先的树遍历,以在理论上找到最"合乎逻辑"的连接路径。

我的问题是,并非所有数据库都将以特别机器逻辑友好的方式设置。这意味着人类可能会因为特定的表或字段名称而看到逻辑联接,而我的算法可能不会。 (下面是我在 c# 中的算法的简单迭代,它还没有记录表之间的路径)

 public Node<T> findClosestObjToNode(Node<T> node, T obj)
    {
        Boolean matchFound = false;
        List<Node<T>> toSearch = new List<Node<T>>();
        List<Node<T>> toSearchNext = new List<Node<T>>();
        toSearchNext.Add(node); //add proimary node to search list
        while(!matchFound){
            toSearch.AddRange(toSearchNext); //copy the searchnext list to search
            toSearchNext.Clear();
            foreach(Node<T> _node in toSearch){
                if (node.contains(obj)) //check for existance of object in the nodes children
                    return node.getChild(obj); //return the child node that contains the object
                else
                    foreach (Node<T> cNode in node.getChildren()) //no matching object found in child nodes
                        toSearchNext.Add(cNode); //so add each child node to the list of nodes to search
            }
            if(toSearchNext.Count == 0) //no match found
                return null;
        }
        return null;
    }

我的问题是真的。我上面计划的方式是否看起来像是整个问题的体面解决方案,或者是否有更好的方法来执行上述操作以获得更准确的表连接。

如果我正确理解了您的要求,那么我质疑您解决这个问题的方法。通常,从数据库中获取特定数据的方法并不多 - 通常只有一种方法可以获取该特定数据。对于TSP类型的问题,有多种可能的解决方案,理想的解决方案是基于对系统的某些约束。我认为您不会从解决方案中获得太多收益,因为您通常会发现只有一种表连接组合可以为您提供所需的数据。

相关内容

  • 没有找到相关文章

最新更新