관계형 데이타 베이스의 가장 취약한 점중 하나는 계층적인 데이타를 표현하기 힘들다는 점입니다.


실제 환경에서는 BOM(Bill Of Materials) 이나 회사의 조직도처럼 계층 구조를 모델링할 일이 많지만 RDB 는 데이타를 계층적으로 모델링할 수 있는 기능이 있습니다.

이때문에 특정 DBMS 에 의존적인 방법(예: 오라클을 사용할 경우 start with connect by 구문 사용) 을 사용하거나 LDAP 처럼 계층 데이타를 표현하기 좋은 별도의 서비스와 연계해서 사용하는 방법이 있습니다.


퍼코나의 개발자가 올린 Models for hierarchical data 슬라이드를 보고 안 내용인데 RDB 에서 계층 데이타를 처리할 수 있는 여러 가지 방법이 있고 이중에 꼭 알아 두어야 할 방법은 Adjacency List와 Closure Table 입니다.

아래와 같은 계층형 데이타가 있을 경우 다음과 같은 방법을 통해 계층 구조를 표현할 수 있습니다.


Adjacency List

가장 쉽고 빠르게 계층 구조를 모델링할 수 있는 방법으로 구현도 용이합니다. 문제는 tree 의 depth 가 깊어질 경우 처리가 무지 어려워지므로 depth 가 깊지 않은 데이타(흔히 볼수 있는 1:1 상담 게시판)를 빠르게 모델링할 때 사용하면 좋습니다.


모든 레코드는 부모 데이타를 참조 키로 가지며 최상위 레코드는 null 이 됩니다.

idparent_idauthorcontent
1nullFran
21Ollie
32Fran
41Kukla
54Ollie


단점

tree depth 가 깊어지면 속도가 느려지고 처리가 어려움

Nested Set

PHP


baum

업그레이드된지 3년이 넘어서 최근 버전의 laravel 지원 안 함.

사용하려면 fork 후 수정 필요



Ruby


Closure Table

계층 구조 표현 끝판왕


PHP

Java

Java 는 JPA 에 포함되어 있는 듯(확인 필요)


Ref