【问题标题】:What data structure should I use to track dependency?我应该使用什么数据结构来跟踪依赖关系?
【发布时间】:2010-11-01 15:38:12
【问题描述】:

我在关系数据库中有一堆表,显然,由于外键关系,它们相互依赖。我想构建一个依赖树,遍历它,并输出 INSERT SQL 语句。我需要首先在我的依赖树中为外键表输出 SQL,因为父表将依赖于它们的外键标识符表中的值。

后序遍历的二叉树是否适合这项任务?

【问题讨论】:

    标签: sql database data-structures binary-tree dependencies


    【解决方案1】:

    看看以下内容:

    Microsoft.SqlServer.Management.Smo.Server
    Microsoft.SqlServer.Management.Smo.Database
    Microsoft.SqlServer.Management.Smo.Scripter

    Microsoft.SqlServer.Management.Smo.DependencyTree
    Microsoft.SqlServer.Management.Smo.DependencyWalker
    Microsoft.SqlServer.Management.Smo.DependencyCollection
    Microsoft.SqlServer.Management.Smo.DependencyCollectionNode

    MSDN 上有关于如何使用所有这些的示例。

    基本上你想要类似的东西

    Server server = new Server(SOURCESERVER);
    Database database = server.Databases[SOURCEDATABASE];
    Scripter sp = new Scripter(server);
    
    ...
    
    UrnCollection col = new UrnCollection();
    
    foreach (Table table in database.Tables)
    {
        col.Add(table.Urn);
    }
    
    ....
    
    DependencyTree tree = sp.DiscoverDependencies(col, DependencyType.Parents);
    DependencyWalker walker = new DependencyWalker(server);
    DependencyCollection depends = walker.WalkDependencies(tree);
    
    //Iterate over each table in DB in dependent order...
    foreach (DependencyCollectionNode dcn in depends)
    
    ...
    

    【讨论】:

    • 啊,太好了。太糟糕了,我正在使用 PHP,太糟糕了,我的数据库缺少外键约束。我最终只使用了递归方法。
    【解决方案2】:

    如果一个表可以依赖于两个以上的表,那么二叉树将是不够的。 让表 A 依赖于表 B、C 和 D。然后您必须先插入 B、C 和 D,即 A 在树中应该有三个子节点。

    我认为您需要使用更通用的树结构,它允许任意数量的子节点。正如您所建议的那样,以后序遍历此树结构应该会产生所需的结果。

    当您的依赖关系图包含循环并且您需要推迟约束检查时,事情将开始变得混乱;)

    【讨论】:

    • 很好地抓住了 n 叉树。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    相关资源
    最近更新 更多