본문 바로가기

IT/MS-SQL

[계층적 쿼리] Hierarchyid와 계층 메서드를 활용한 계층구조 표현

계층형 쿼리 (Hierarchical Query)

관계형 데이터베이스는 2차원 테이블구조. 실무에선 계층적 데이터구조를 많이 활용함.

특정 컬럼을 통해 데이터간의 부모-자식 관계를 표현하는 관계를 순환관계(Recursive Relationship)라 함.

   ex) 군부대 관련 데이터베이스에서 상위부대번호(PK)를 부대의 부모키로 지정하여 부대간 계층 관계 표현


Hierarchyid

- MS-SQL에서는 계층적 데이터구조의 구현에 Hierarchyid라는 데이터타입을 지원함. (부모키 방식은 대체적으로 활용)

- Hierarchyid는 계층적 데이터의 가장 일반적인 형식으로 트리 계층에서 노드의 위치를 나타냄.

Hierarchyid 데이터타입의 인덱스는 데이터 저장시 깊이 우선(Depth First) 저장을 지원함.

   ex) A와 B가 특정 노드의 hierarchyid값일 때 A<B는 깊이 우선 트리구조에서 A가 B의 상위 노드로 위치한다는 것을 의미함.

  이때 hierarchyid 인덱스를 적용할 경우 B는 A의 위치에 인접하게 저장됨.


Hierarchyid의 제한사항 (이해한 것만 기록함;)

- UNIQUE 제약조건을 사용하거나 자체 논리를 통해 고유성을 적용하지 않는 한 기본 고유성 보장X.

- 외래키(Foreign Key)와 적용방식이 다름. A에 하위노드 B가 존재하는 상태에서 A를 삭제 가능.


Hierarchyid를 활용한 계층적 데이터구조의 인덱싱 방법

 1) 깊이 우선 인덱스 (Depth-First Index)

     CREATE CLUSTERED INDEX Index_Org_DepthFirst

     ON dbo.EmployeeOrg(hierarchyid);

     

    - Hierarchyid 자체에 인덱스를 적용.

     - 하위 트리의 행이 서로 가깝게 저장됨.

       ex) 같은 관리자에게 직접 보고하는 직원의 레코드는 가깝게 저장

 2) 너비 우선 인덱스 (Breadth-First Index)

     CREATE CLUSTERED INDEX Index_Org_BreadthFirst

     ON dbo.EmployeeOrg(hierarchyid);

     

     - 노드의 Level과 Hierarchyid에 인덱스를 적용.

     - 계층의 각 수준에 행을 함께 저장함.

       ex) 계층 구조상 동일한 레벨의 직원의 레코드는 가깝게 저장 .


계층 메서드의 활용 (링크 : MS-SQL Server TechNote)