リレーショナル データベースには、明らかに外部キー関係のために互いに依存しているテーブルがたくさんあります。依存関係ツリーを構築し、それをトラバースして、INSERT SQL ステートメントを出力したいと考えています。親テーブルは外部キー識別子テーブルの値に依存するため、最初に依存関係ツリー内の外部キー テーブルの SQL を出力する必要があります。
ポストオーダーでたどる二分木は、このタスクに適しているように見えますか?
リレーショナル データベースには、明らかに外部キー関係のために互いに依存しているテーブルがたくさんあります。依存関係ツリーを構築し、それをトラバースして、INSERT SQL ステートメントを出力したいと考えています。親テーブルは外部キー識別子テーブルの値に依存するため、最初に依存関係ツリー内の外部キー テーブルの SQL を出力する必要があります。
ポストオーダーでたどる二分木は、このタスクに適しているように見えますか?
以下を見てください。
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)
...
テーブルが 3 つ以上のテーブルに依存する可能性がある場合、バイナリ ツリーでは不十分です。テーブル A がテーブル B、C、および D に依存しているとします。次に、最初に B、C、および D に挿入する必要があります。つまり、A はツリーに 3 つの子ノードを持つ必要があります。
任意の数の子ノードを許可する、より一般的なツリー構造を使用する必要があると思います。あなたが提案したように、このツリー構造をポストオーダーでトラバースすると、望ましい結果が得られるはずです。
ディペンデンシー グラフにサイクルが含まれていて、制約チェックを延期する必要がある場合、事態は混乱し始めます;)