Какую структуру данных я должен использовать для отслеживания зависимости? - PullRequest
0 голосов
/ 10 июня 2009

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

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

Ответы [ 2 ]

3 голосов
/ 11 июня 2009

Взгляните на следующее:

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)

...
1 голос
/ 10 июня 2009

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

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

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

...