2009-06-09 9 views
0

私は、明らかに、外部キーの関係のためにお互いに依存しているリレーショナルデータベースにテーブルを束ねています。私は、依存ツリーを構築し、それをトラバースし、INSERT SQL文を出力したい。親テーブルは外部キー識別子テーブルの値に依存するため、まず従属ツリーの外部キーテーブルのSQLを最初に出力する必要があります。依存関係を追跡するために使用するデータ構造は何ですか?

ポストオーダーでトラバースされたバイナリツリーは、このタスクに適しているようですか?

答えて

1

テーブルが2つ以上のテーブルに依存する可能性がある場合、バイナリツリーは不十分です。 テーブルAがテーブルB、C、Dに依存するようにします。次に、B、C、Dに挿入する必要があります。つまり、ツリーに3つの子ノードが必要です。

私は、任意の数の子ノードを許可するより一般的なツリー構造を使用する必要があると思います。あなたが示唆したように、このツリー構造をポストオーダーでトラバースすると、望ましい結果が得られるはずです。

物事はあなたの依存関係グラフは、サイクルが含まれており、制約チェックを延期する必要があるときに厄介取得するために開始します。)

+0

グッドキャッチのような何かをしたいです。 –

3

次を見てみましょう:

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上の例があります。

基本的に、あなたは、n分木の

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) 

... 
+0

ああ、それは甘いです。あまりにも私はPHPを使用して悪い、私のデータベースにも外国キーの制約が不十分です。私はちょうど再帰的な方法を使用して終了しました。 –

関連する問題