2009-06-09 6 views
0

필자는 외래 키 관계로 인해 분명히 서로 의존하는 관계형 데이터베이스에 많은 테이블을 가지고 있습니다. 종속성 트리를 만들고 트래버스하고 INSERT SQL 문을 출력하려고합니다. 부모 테이블은 외래 키 식별자 테이블의 값에 의존하기 때문에 먼저 내 종속성 트리의 외래 키 테이블에 대해 SQL을 출력해야합니다.종속성을 추적하려면 어떤 데이터 구조를 사용해야합니까?

포스트 오더에서 트래버스 한 이진 트리가이 작업에 적합합니까?

답변

1

테이블이 두 개 이상의 테이블에 종속 될 수 있으면 이진 트리가 충분하지 않습니다. 테이블 A가 테이블 B, C 및 D에 종속되도록하십시오. 그러면 B, C 및 D에 먼저 삽입해야합니다. 즉, A는 트리에 세 개의 자식 노드가 있어야합니다.

임의의 수의 자식 노드를 허용하는보다 일반적인 트리 구조를 사용해야한다고 생각합니다. 포스트 트리 구조에서이 트리 구조를 탐색하면 제안한대로 원하는 결과를 얻을 수 있습니다.

Microsoft.SqlServer.Management.Smo.Server
:

+0

좋은 캐치 같은 것을 원한다. –

3

는 다음에 봐)

상황이 당신의 의존성 그래프가 사이클을 포함하는 경우 혼란스러워하기 시작합니다 그리고 당신은 제약 조건 확인을 연기 할 필요가 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 모든이를 사용하는 방법에 대한 MSDN의 예제가있다


Microsoft.SqlServer.Management.Smo.DependencyCollectionNode.

은 기본적으로 당신은 n 차 나무에

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를 사용하고 있고 데이터베이스에 외래 키 제약이 없다. 나는 재귀 적 방법을 사용하여 끝냈다. –

관련 문제