0

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

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

我还希望添加不需要报表模型的功能。我的应用程序将扫描目标 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;
    }

我的问题是真的。我上面计划的方式似乎是对整个问题的一个不错的解决方案,还是有更好的方法来执行上述操作以获得更准确的表连接。

4

1 回答 1

1

If I have understood your requirements properly, then I question your approach to this problem. Normally, there are not many ways to get a certain piece of data from a database - there is usually one and only one way to get that specific piece of data. With TSP type problems there are multiple possible solutions and the ideal solution is based on some constraint on the system. I don't think you are going to get much gain from your solution as you will most often find that their is only one combination of table joins that will provide you with the data that you need.

于 2014-04-03T14:32:33.113 回答