我正在创建一个类似报表生成器的应用程序,目的是制作一个对新手非常友好的前端。
应用程序的后端将由可以构建“报告模型”的开发人员管理,该报告模型将指定要包含哪些表、字段和连接以供最终用户使用。
我还希望添加不需要报表模型的功能。我的应用程序将扫描目标 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;
}
我的问题是真的。我上面计划的方式似乎是对整个问题的一个不错的解决方案,还是有更好的方法来执行上述操作以获得更准确的表连接。