Computer >> 컴퓨터 >  >> 프로그래밍 >> SQL

계층형 데이터베이스 모델 완벽 이해: 구조, 장단점, 활용 사례

계층형(hierarchical) 데이터베이스 모델은 데이터를 트리(tree) 구조로 표현하며, 각 레코드는 단 하나의 부모(parent)만 가집니다. 형제(sibling) 노드들의 순서를 유지하기 위해 정렬 필드(sort field)가 사용되며, 이를 통해 노드들이 기록된 순서대로 정렬됩니다. 이러한 모델은 초기 메인프레임 데이터베이스 관리 시스템을 위해 설계되었으며, 대표적인 예로 IBM의 IMS(Information Management System)를 들 수 있습니다.

이 모델 구조는 두 개 이상의 데이터 유형 간에 일대일(1:1) 및 일대다(1:N) 관계를 허용합니다. 목차나 중첩·정렬된 정보처럼 실제 세계의 다양한 관계를 설명하는 데 매우 유용합니다.

계층 구조는 저장 장치에서 레코드의 물리적 순서로 활용됩니다. 포인터와 순차 접근 방식을 결합하여 데이터 구조를 따라 아래로 탐색하면서 레코드에 접근할 수 있습니다. 다만 각 레코드에 대한 전체 경로(full path)가 포함되지 않으면 특정 데이터베이스 연산에는 적합하지 않다는 한계가 있습니다.

이러한 데이터베이스의 데이터는 계층적으로 구조화되며, 일반적으로 역트리(inverted tree) 형태로 구축됩니다. 구조의 '루트(root)'는 데이터베이스의 단일 테이블이며, 나머지 테이블들은 루트에서 뻗어 나가는 가지(branch) 역할을 합니다. 아래 다이어그램은 대표적인 계층형 데이터베이스 구조를 보여줍니다.

계층형 데이터베이스 모델 완벽 이해: 구조, 장단점, 활용 사례

에이전트(Agents) 데이터베이스 예제

위 다이어그램에서 한 명의 에이전트는 여러 엔터테이너(entertainer)를 관리하고, 각 엔터테이너는 자신만의 스케줄을 가집니다. 에이전트는 엔터테인먼트 요구를 충족해야 하는 여러 고객을 관리할 책임이 있습니다. 고객은 에이전트를 통해 공연 계약을 체결하고, 서비스에 대한 대금을 에이전트에게 지급합니다.

이 데이터베이스 모델에서 관계는 '부모/자식(parent/child)'이라는 용어로 표현됩니다. 부모 테이블은 하나 이상의 자식 테이블과 연결될 수 있지만, 자식 테이블은 오직 하나의 부모 테이블에만 연결될 수 있습니다. 테이블들은 포인터/인덱스 또는 테이블 내 레코드의 물리적 배치를 통해 명시적으로 연결됩니다.

사용자는 루트 테이블에서 시작하여 트리를 따라 내려가며 원하는 데이터에 접근할 수 있습니다. 복잡함 없이 데이터에 접근하려면 사용자가 데이터베이스 구조에 익숙해야 한다는 점에 유의해야 합니다.

장점

  • 테이블 구조 간에 명시적인 링크가 존재하기 때문에 사용자가 매우 빠르게 데이터를 검색할 수 있습니다.
  • 참조 무결성(referential integrity)이 내장되어 자동으로 강제됩니다. 즉, 자식 테이블의 레코드는 반드시 부모 테이블의 기존 레코드와 연결되어야 하며, 부모 테이블의 레코드가 삭제되면 자식 테이블의 관련 레코드들도 함께 삭제됩니다.

단점

  • 부모 테이블의 어떤 레코드와도 관련이 없는 레코드를 자식 테이블에 저장해야 할 때 기록이 어렵고, 사용자는 부모 테이블에 추가 항목을 먼저 기록해야 합니다.
  • 복잡한 관계를 지원할 수 없으며, 중복(redundancy) 문제도 발생합니다. 이는 여러 위치에서 데이터가 일관성 없이 기록될 경우 부정확한 정보가 생성되는 결과로 이어질 수 있습니다.

중복 데이터 문제와 해결 방법

앞선 다이어그램의 데이터베이스를 예로 들어 보겠습니다. 자식 테이블(Entertainers)의 레코드는 반드시 부모 테이블(Agents)의 레코드와 연결되어야 하므로, 사용자는 해당 엔터테이너가 Agents 테이블에서 특정 에이전트에 배정되기 전까지는 Entertainers 테이블에 새 레코드를 입력할 수 없습니다. 또한 이런 유형의 데이터베이스는 중복 데이터 문제를 안고 있습니다.

예를 들어 고객과 엔터테이너 사이에 다대다(N:M) 관계가 있다고 가정해 보겠습니다. 한 엔터테이너는 여러 고객을 위해 공연하고, 한 고객은 여러 엔터테이너를 고용합니다. 이러한 관계는 계층형 데이터베이스에서 쉽게 모델링할 수 없기 때문에, 개발자는 Schedule 테이블과 Engagements 테이블 양쪽에 중복 데이터를 도입해야만 합니다.

  • Schedule 테이블: 각 엔터테이너가 누구를 위해 어디에서 공연하는지 보여주기 위해 고객 이름, 주소, 전화번호 등의 고객 데이터가 포함됩니다. 이 데이터는 Clients 테이블에 이미 저장되어 있으므로 중복입니다.
  • Engagements 테이블: 특정 고객을 위해 어떤 엔터테이너들이 공연하는지 나타내기 위해 엔터테이너 이름, 전화번호, 엔터테이너 유형 등의 데이터가 포함됩니다. 이 데이터 역시 Entertainers 테이블에 이미 저장되어 있으므로 중복입니다.

이러한 중복의 문제점은 사용자가 동일한 데이터를 서로 다르게 입력할 가능성을 열어준다는 데 있습니다. 그 결과 부정확한 정보가 만들어질 수 있습니다.

이 문제는 엔터테이너 전용 계층형 데이터베이스 하나와 에이전트 전용 계층형 데이터베이스 하나를 각각 구축하여 해결할 수 있습니다. Entertainers 데이터베이스에는 Entertainers 테이블의 데이터만 담고, 수정된 Agents 데이터베이스에는 Agents, Clients, Payments, Engagements 테이블의 데이터를 담습니다. Agents 데이터베이스의 Engagements 테이블과 Entertainers 데이터베이스의 Entertainers 테이블 사이에 논리적 자식(logical child) 관계를 정의하면 되므로, 별도의 추가 작업은 필요하지 않습니다. 이 관계가 설정되면 특정 고객이 예약한 엔터테이너 목록이나 특정 엔터테이너의 공연 일정 같은 다양한 정보를 손쉽게 조회할 수 있습니다. 아래 다이어그램은 전체 구성을 보여줍니다.

계층형 데이터베이스 모델 완벽 이해: 구조, 장단점, 활용 사례

역사와 한계

계층형 데이터베이스는 1970년대 메인프레임이 사용하던 테이프 저장 시스템과 잘 어울렸으며, 이러한 시스템 기반의 데이터베이스를 운영하던 조직에서 큰 인기를 누렸습니다. 계층형 데이터베이스는 빠르고 직접적인 데이터 접근을 제공하여 여러 상황에서 유용했지만, 데이터 중복과 데이터 간 복잡한 관계라는 커다란 문제를 해결하려면 새로운 데이터베이스 모델이 필요하다는 것이 분명해졌습니다.

이 데이터베이스 모델의 기본 개념은 특정 유형의 데이터 저장에는 유용하지만, 범용성이 떨어져 몇 가지 특수한 용도로 제한됩니다.

예를 들어 회사의 각 직원이 특정 부서에 소속되어 보고하는 조직을 생각해 볼 수 있습니다. 이 경우 부서를 부모 레코드로, 개별 직원들을 자식 레코드로 표현하면, 각 직원 레코드는 계층 구조에서 그 하나의 부모 레코드로 연결됩니다.