2009-06-09 6 views
0

J'ai un tas de tables dans une base de données relationnelle qui, évidemment, dépendent les unes des autres en raison de relations de clés étrangères. Je veux construire une arborescence de dépendances, la traverser et produire des instructions SQL INSERT. Je dois d'abord afficher SQL pour les tables de clés étrangères dans mon arbre de dépendance, car les tables parent dépendront des valeurs de leurs tables d'identifiants de clé étrangère.Quelle structure de données dois-je utiliser pour suivre la dépendance?

Un arbre binaire, traversé en post-commande, semble-t-il adapté à cette tâche?

Répondre

1

Si une table peut dépendre de plus de deux tables, une arborescence binaire sera insuffisante. Laissez la table A dépendante des tables B, C et D. Ensuite, vous devrez d'abord insérer dans B, C et D, c'est-à-dire que A doit avoir trois nœuds enfants dans votre arbre.

Je pense que vous devez utiliser une structure arborescente plus générale qui autorise un nombre arbitraire de nœuds enfants. Traverser cette structure arborescente en post-commande devrait produire les résultats souhaités, comme vous l'avez suggéré.

Les choses vont commencer à se salir lorsque votre graphe de dépendance contient des cycles et vous devez reporter la vérification des contraintes;)

+0

Bonne prise sur l'arbre n-aire. –

3

Jetez un oeil à l'adresse suivante:

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

Il y a des exemples sur MSDN sur la façon d'utiliser tout cela.

Essentiellement, vous voulez quelque chose comme

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

Ah, c'est gentil. Dommage que j'utilise PHP, et dommage que ma base de données manque de contraintes de clés étrangères. J'ai fini par utiliser une méthode récursive. –

Questions connexes