2009-06-09 2 views
0

У меня есть куча таблиц в реляционной базе данных, которые, очевидно, зависят друг от друга из-за внешних ключей. Я хочу построить дерево зависимостей, пересечь его и вывести инструкции INSERT SQL. Сначала мне нужно сначала выводить SQL для таблиц внешних ключей в моем дереве зависимостей, потому что родительские таблицы будут зависеть от значений из их таблиц идентификаторов внешнего ключа.Какую структуру данных следует использовать для отслеживания зависимостей?

Является ли двоичное дерево, пройденное в постоперационном порядке, подходящим для этой задачи?

ответ

1

Если таблица может зависеть от более чем двух таблиц, двоичного дерева будет недостаточно. Пусть таблица A зависит от таблиц B, C и D. Затем вам нужно сначала вставить в B, C и D, то есть A должно иметь три дочерних узла в вашем дереве.

Я думаю, вам нужно использовать более общую древовидную структуру, которая позволяет произвольное число дочерних узлов. Перемещение этой древовидной структуры в пост-порядке должно дать желаемые результаты, как вы предложили.

Вещи начинают запутаться, когда ваш график зависимости содержит циклы, и вы должны отложить проверку ограничения;)

+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 о том, как использовать все это.

По сути вы хотите что-то вроде

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, и слишком плохо, что в моей базе данных отсутствуют ограничения внешнего ключа. Я закончил тем, что использовал рекурсивный метод. –

Смежные вопросы