我有一堆關係數據庫中的表,顯然,由於外鍵關係而相互依賴。我想構建一個依賴關係樹,遍歷它並輸出INSERT SQL語句。我需要首先在依賴關係樹中爲外鍵表輸出SQL,因爲父表將依賴於其外鍵標識表中的值。我應該用什麼數據結構來跟蹤依賴關係?
在後序遍歷的二叉樹看起來適合這個任務嗎?
我有一堆關係數據庫中的表,顯然,由於外鍵關係而相互依賴。我想構建一個依賴關係樹,遍歷它並輸出INSERT SQL語句。我需要首先在依賴關係樹中爲外鍵表輸出SQL,因爲父表將依賴於其外鍵標識表中的值。我應該用什麼數據結構來跟蹤依賴關係?
在後序遍歷的二叉樹看起來適合這個任務嗎?
如果一個表可能依賴於兩個以上的表,則二叉樹將不夠用。 讓表A依賴於表B,C和D.然後你必須首先插入B,C和D,即A應該在你的樹中有三個子節點。
我想你需要使用更一般的樹結構,它允許任意數量的子節點。正如你所建議的那樣,在後序中遍歷這個樹結構應該會產生所需的結果。
事情開始變得混亂,當你依賴圖包含循環,你需要推遲約束檢查;)
看看以下內容:
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,太糟糕了,我的數據庫缺少外鍵約束。我最終只使用遞歸方法。 – 2009-06-11 17:45:35
在n叉樹良好的漁獲物。 – 2009-06-11 17:43:48