我正在创建一个类似报告生成器的应用程序,目的是制作一个对新手非常友好的前端。
应用程序的后端将由开发人员管理,他们可以构建一个"报表模型",该模型将指定要包含哪些表、字段和联接供最终用户使用。
我还希望添加不需要报表模型的功能。我的应用程序将扫描目标 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类型的问题,有多种可能的解决方案,理想的解决方案是基于对系统的某些约束。我认为您不会从解决方案中获得太多收益,因为您通常会发现只有一种表连接组合可以为您提供所需的数据。