DB/마스터링 몽고DB 7.0

[6장] 스키마 설계와 데이터 모델링

꾸준함. 2025. 7. 11. 23:08

서론

  • 현대 데이터베이스 관리에서 데이터 구조화 방식의 선택은 시스템의 성능과 확장성을 결정짓는 중추적인 요소
  • 몽고DB와 같은 현대적 데이터베이스의 도입으로, 데이터 관리 전략의 패러다임이 크게 변화하고 있고 특히 유연성과 확장성을 고려한 데이터 구조화의 중요성이 더욱 주목받고 있음

 

관계형 데이터베이스를 위한 스키마 설계

  • 관계형 데이터베이스의 핵심은 데이터의 신뢰성 보장과 시스템의 효율적 운영이며 이를 위한 두 가지 기본 원칙을 살펴보면 다음과 같음
    • 데이터 이상 현상 방지
    • 데이터 중복 감소

 

  • RDBMS에서 데이터 이상 현상은 데이터 수정 작업 과정에서 발생하는 정보의 불일치를 의미하며 이는 주로 데이터의 삽입, 삭제, 갱신과 같은 작업을 수행할 때 발생할 수 있음
  • 데이터 중복성은 동일한 정보가 데이터베이스의 여러 테이블에 불필요하게 중복으로 저장되는 현상을 의미하며 이러한 중복은 데이터의 일관성을 해치고 무결성 유지를 어렵게 만드는 주요 원인
  • 따라서 데이터베이스 설계 단계에서부터 이러한 중복을 최소화하고, 일관된 데이터 관리가 가능한 구조를 만드는 것이 매우 중요함

 

1. 정규형

  • 관계형 데이터베이스 설계에서 정규화는 데이터의 일관성과 효율성을 보장하는 핵심 원칙
  • 정규형은 데이터베이스 구조를 체계적으로 개선하는 단계적 지침을 제공하며, 이를 통해 데이터 중복을 최소화하고 데이터 조작 과정에서 발생할 수 있는 각종 이상 현상을 예방할 수 있음
  • 정규형의 특징은 그 계층적 구조에 있고 각 단계의 정규형은 이전 단계의 정규형을 기반으로 하며, 더 높은 수준의 데이터 품질을 보장하기 위해서는 반드시 이전 단계의 요구사항을 충족해야 함
  • 정규화 과정은 다음과 같이 여러 단계로 구성되어 있음
    • 제1 정규형: 중복을 제거하고 쿼리를 단순화시킴
    • 제2 정규형: 기본키에 관해 모든 비주요 속성이 완전 함수 종속 관계를 맺을 때, 데이터베이스에서 중복된 정보를 제거할 수 있음
    • 제3 정규형: 모든 속성이 기본키에만 함수 종속
    • BCNF 정규형: 제3 정규형을 더욱 강화한 형태로, 테이블의 모든 비자명한 함수적 종속성이 반드시 슈퍼키를 통해 성립
    • 제4 정규형: 테이블에 다중값 종속성이 없음을 보장
    • 제5 정규형: 데이터베이스 정규화 과정의 최상위 단계로 데이터베이스의 논리적 완전성을 극대화하기 위해 테이블을 더 작은 단위로 세분화하는 과정을 포함시킴

 

  • 관계형 데이터베이스의 테이블과 열 구조는 데이터 단위 간의 함수적 종속성을 기반으로 구성되는데 이러한 형식적 접근 방식은 데이터의 정규화를 보장하지만, 초기 도메인 모델보다 훨씬 많은 수의 테이블이 생성될 수 있다는 실질적인 한계를 가지고 있음

 

몽고DB를 위한 스키마 설계

  • 몽고DB로의 전환 시에는 기존 관계형 데이터베이스의 접근 방식과는 다른 모델링 전략이 요구됨
  • 효과적인 몽고DB 설계의 핵심은 사용자의 데이터 조회 요구사항을 정확히 파악하는 것이며 이는 시스템 엔티티의 구조를 결정하는 데 결정적인 역할
  • 관계형 데이터베이스가 정규화를 중시하고 데이터 중복을 지양하는 것과 달리, 몽고DB는 성능 최적화와 유연성 확보를 위해 의도적으로 데이터 중복과 비정규화를 활용함
  • 몽고DB의 문서 모델은 독특한 강점을 제공함
    • 하나의 컬렉션 내에서도 각 문서는 서로 다른 구조를 가질 수 있으며, 같은 필드명이라도 다른 데이터 타입을 포함할 수 있음
    • 몽고DB는 내장 문서 수준에서도 상세한 쿼리 실행이 가능하므로, 문서 설계에 있어 상당한 자유도를 제공함
    • 데이터 접근 패턴을 자세히 분석함으로써, 어떤 필드를 문서에 직접 포함시킬지, 또는 별도의 컬렉션으로 분리하여 참조할지를 전략적으로 결정할 수 있음

 

몽고DB의 데이터 모델링

  • 몽고DB의 데이터 모델링은 관계형 데이터베이스와는 차별화된 특성을 보이며 다음과 같이 크게 두 가지 측면에서 고려가 필요함
    • 애플리케이션의 요구사항과 사용자 상호작용 패턴
    • 효율적인 성능과 데이터 접근을 위한 구체적인 패턴

 

  • 위 두 요소의 균형점을 찾는 것이 몽고DB의 문서 기반 데이터 구조를 설계하는 데 핵심

 

1. 문서 구조

  • 몽고DB의 가장 주목할 만한 특징은 유연한 문서 구조
  • 최대 100단계까지 중첩이 가능한 BSON 문서와 배열을 지원하는데, 이는 단순한 기술적 특징을 넘어 실질적인 이점을 제공함
    • 이러한 깊이 있는 구조는 데이터베이스의 유연성을 극대화할 뿐만 아니라, 애플리케이션의 요구사항에 최적화된 방식으로 데이터를 구성할 수 있게 함

 

  • 특히 이러한 구조적 특징은 세 가지 핵심적인 장점을 제공함
    • 복잡한 조인 연산의 필요성을 크게 줄여줌
    • 데이터 검색 과정을 효율적으로 만들어줌
    • 쿼리 작성을 단순화함

 

2. 내장된 데이터

  • 몽고DB는 연관된 데이터를 단일 문서 안에 효과적으로 통합할 수 있는 구조를 제공함
  • 이러한 설계는 데이터 간의 관계를 직관적으로 표현할 수 있게 해주며, 문서 내부의 필드나 배열에 다양한 수준의 중첩 구조를 수용할 수 있음
  • 이러한 비정규화된 데이터 모델의 핵심적인 이점은 데이터베이스 운영의 효율성에 있음
    • 애플리케이션은 단일  데이터베이스 작업만으로도 연관된 모든 데이터에 접근하고 수정할 수 있음

 

 

 

3. 참조

  • 몽고DB의 참조 기능은 문서 간 연결을 체계적으로 구현하는 방식을 제공하며 이는 서로 다른 컬렉션에 있는 문서들을 연결하는 링크나 포인터를 활용하여 구현됨
  • 이러한 참조 시스템을 통해 애플리케이션은 필요한 관련 데이터를 효율적으로 조회할 수 있으며, 이는 전통적인 관계형 데이터베이스의 정규화된 데이터 모델과 유사한 접근 방식
  • 대학 강좌 관리 시스템을 예로 들면, 강좌 문서는 교수의 _id 값을 참조하여 교수 정보와 연결됨
    • 이러한 참조 기반 설계는 컬렉션 간 효율적인 데이터 연결을 가능하게 하며, 데이터의 정규화를 보장함
    • 특히 데이터의 일관성 유지와 중복 최소화가 중요한 환경에서 유용한 접근 방식

 

 

 

4. 비정규화

  • 몽고DB에서 비정규화는 전략적인 데이터 중복을 통해 읽기 성능을 최적화하는 설계 방식이며 이는 데이터의 중복성과 성능 사이의 균형을 고려한 의도적인 설계 결정
    • i.g. 도서 정보를 관리할 때 저자의 이름 authorName을 책 문서에 직접 포함시키는 방식을 고려할 수 있음
    • 이러한 접근 방식은 데이터 조회 시 단일 작업만으로 필요한 정보를 획득할 수 있어 조회 성능이 현저히 향상

 

 

5. BSON과 해당 데이터 유형

  • Binary JSON은 몽고DB의 데이터 저장 기반을 형성하는 핵심 요소
  • BSON은 JSON과 기본적인 구조는 유사하나, 더욱 다양한 데이터 타입을 지원하며 저장과 검색 성능에 최적화된 특성을 갖추고 있음
  • BSON의 설계는 다음과 같은 세 가지 핵심 특성을 중심으로 이루어짐
    • 경량: 데이터 저장과 전송에 있어 공간 효율성은 매우 중요한 요소이며, 이는 BSON 설계의 핵심 원칙 중 하나; 특히 네트워크를 통한 데이터 전송 시에는 공간 오버헤드의 최소화가 성능에 직접적인 영향을 미치며 BSON은 이러한 요구사항을 충족하기 위해 효율적인 데이터 압축과 저장 구조를 채택함
    • 순회 가능: BSON의 순회 효율성은 몽고DB의 핵심 데이터 표현 방식으로 데이터 구조를 빠르고 효율적으로 탐색할 수 있도록 최적화되어 있음
    • 효율적: BSON이 C 데이터 타입을 기반으로 설계되었다는 점은 매우 중요한 기술적 이점을 제공하는데 이러한 설계 선택은 다양한 프로그래밍 언어에서 BSON 데이터의 인코딩과 디코딩을 매우 효율적으로 수행할 수 있게 지원

 

  • BSON은 몽고DB의 데이터 저장 시스템에서 중추적인 역할을 담당하며, 표준 JSON이 제공하는 것보다 더욱 포괄적인 데이터 타입을 지원함
    • 이러한 확장된 데이터 타입 지원은 현대적인 애플리케이션 개발에서 요구되는 다양한 데이터 형식을 효과적으로 처리할 수 있게 해 줌

 

몽고DB 데이터베이스 모델링: 설계 원칙과 권장 사례

  • 몽고DB에서의 데이터 모델링은 단순한 데이터 표현을 넘어 효율성, 효과성을 동시에 추구해야 함
  • 몽고DB는 높은 수준의 유연성을 제공하지만, 이러한 유연성을 최대한 활용하기 위해서는 체계적인 데이터 구조화 방법 필요

 

1. 읽기-쓰기 비율

  • 애플리케이션의 읽기-쓰기 비율을 이해하는 것은 데이터베이스 성능 최적화의 핵심 요소
  • 이러한 이해를 바탕으로 데이터 저장과 검색 방식을 효과적으로 설계할 수 있음
    • 읽기 고려 사항: 샤딩 클러스터에서의 데이터 접근 방식이 중요한데 특히 스캐더-개더 방식의 쿼리는 가능한 한 지양해야 하며, 이를 위해 연관된 데이터를 단일 문서에 내장하는 전략을 고려할 수 있음 (다만, 과도한 데이터 내장은 문서 크기 증가와 수정 효율성 저하를 초래할 수 있으므로, 적절한 균형점을 찾는 것이 중요)
    • 쓰기 고려 사항: 샤딩 환경에서는 작업 부하를 여러 서버나 샤드에 효과적으로 분산시키는 것이 중요한데 이는 적절한 샤딩 전략과 효율적인 샤드 키 설정을 통해 달성 가능
    • 쿼리-수정 비율: 읽기 쿼리와 수정 쿼리 비율 분석은 인덱싱 전략 수립에 중요한 지표; 데이터 접근과 수정 빈도를 파악함으로써, 자주 사용되는 필드에 관한 효과적인 인덱스 설계가 가능해짐

 

설계 패턴과 스키마 설계

  • 몽고DB의 스키마 설계는 시스템의 성능과 확장성을 결정짓는 핵심 요소
  • 적절한 설게 패턴의 선택과 적용은 데이터 모델의 효율성을 크게 향상할 수 있으며 다양한 설계 패턴을 깊이 이해하고 상황에 맞게 적용하는 것은 데이터베이스 아키텍처의 성공적인 구현을 위해 필수적

 

1. 버킷 패턴

  • 연속적인 데이터 스트림을 효율적으로 관리하기 위해 최적화된 설계 방식
  • 해당 패턴은 특히 시계역 데이터, 실시간 분석 그리고 IoT 애플리케이션에서 발생하는 대량의 스트리밍 데이터를 처리하는 데 탁월한 성능을 보여줌
  • 해당 패턴의 주요 이점은 세 가지 측면에서 나타남
    • 전체 문서의 수를 효과적으로 감소시켜 시스템 부하를 줄임
    • 데이터 접근 방식을 단순화하여 조회 효율성을 높임
    • 인덱스 성능을 개선하여 전반적인 시스템 응답성을 향상함

 

  • 실제 적용 사례를 살펴보면, IoT 환경에서의 온도 모니터링 시스템을 예로 들 수 있음
    • 매분 센서에서 온도 데이터가 전송되는 상황에서 각각의 측정값을 개별 문서로 저장하는 대신 시간 단위로 데이터를 그룹화하여 저장하는 방식 채택


 

2. 속성 패턴

  • 다수의 유사한 필드가 포함된 대규모 문서를 다룰 때 적합한 패턴
  • 해당 패턴은 정렬이나 검색 시 공통된 특성을 가진 필드들을 효과적으로 관리할 수 있게 해 주며 특히 특정 필드들이 제한된 수의 문서에만 나타날 때에 더욱 유용함
  • 예를 들어 전자상거래 플랫폼의 제품 카탈로그를 살펴보면, 제품마다 해당 제품의 유형에 따라 서로 다른 속성들을 가질 수 있음


 

3. 다형성 패턴

  • 서로 다른 유형의 문서들이 공통점을 많이 공유하면서도 단일 컬렉션으로 관리해야 할 때 효율적
  • 의료 데이터베이스를 예로 들자면 정기 건강검진 기록, 수술 기록, 치과 진료 기록과 같이 각기 다른 형태의 의료 기록을 하나의 시스템에서 통합적으로 관리해야 하는 경우가 이에 해당함


 

4. 스키마 버전 관리 패턴

  • 문서에 버전 정보를 포함해 데이터 구조를 단계적으로 발전시킬 수 있게 지원하는 패턴
  • 스키마 버전을 체계적으로 관리함으로써 애플리케이션이 다양한 스키마 형태를 효과적으로 처리할 수 있으며, 이는 데이터 마이그레이션과 수정 과정을 더욱 원활하게 해 줌
  • 이러한 패턴의 실제 적용 사례로 소셜 미디어 플랫폼의 사용자 프로필 관리를 들 수 있음
    • 플랫폼이 발전하고 새로운 기능이 추가됨에 따라 사용자 프로필의 데이터 구조도 자연스럽게 변화하게 되는데, 이때 버전관리를 통해 이러한 변화를 체계적으로 수용할 수 있음


 

5. 확장 참조 패턴

  • 빈번한 데이터 접근 시 발생하는 반복적인 JOIN 연산을 최적화하고자 하는 애플리케이션에 특히 효과적인 패턴
  • 자주 조회하는 필드를 주요 문서에 포함하는 확장 참조 패턴을 적용하면, JOIN 연산의 횟수를 줄이고 데이터 읽기 속도를 향상할 수 있음
  • 전자상거래 플랫폼의 예시를 통해 살펴보면, 주문 정보를 표시할 때 제품의 모든 상세 정보가 아닌 제품명과 가격과 같은 핵심 정보만을 포함하는 것이 일반적


 

6. 근사치 패턴

  • 정확성보다 성능이 중요한 상황에서 활용도가 높은 패턴
  • 실시간으로 리소스를 많이 사용하는 연산이나 집계 대신, 사전 계산된 값이나 추정치, 캐싱된 데이터를 활용하여 신속한 응답이 가능함
    • 이는 실시간 분석이나 조회수 집계처럼 정확한 수치보다는 대략적인 값으로도 충분한 경우에 쿼리 성능을 향상하는 데 효과적

 

  • 기사 조회수를 집계하는 웹사이트를 예시로 들 수 있음
    • 트래픽이 높은 상황에서 접속마다 실시간으로 정확한 조회수를 갱신하는 것은 시스템에 과도한 부하를 초래할 수 있음


 

7. 계산된 패턴

  • 특정 연산 결과를 사전에 계산하여 문서에 저장하는 방식
  • 실시간 계산 대신 미리 연산된 결괏값을 활용함으로써, 복잡한 집계나 계산이 필요한 고빈도 접근 데이터를 효율적으로 처리할 수 있음
    • 이러한 사전 계산 방식을 통해 조회 작업을 최적화하고 쿼리 성능을 향상할 수 있음

 

  • 구체적인 활용 사례로 전자상거래 플랫폼의 상품 평점 시스템을 들 수 있음
    • 상품 페이지 접속 시마다 평균 평점을 실시간으로 계산하는 대신, 시스템은 산출된 평균값을 저장하고 이를 정기적 또는 새로운 평가가 등록될 때마다 갱신하는 방식으로 운영


 

8. 이상치 패턴

  • 데이터셋에서 발생하는 이상치를 효과적으로 관리하는 방안을 제시하는 패턴
  • 일반적으로 데이터 대다수는 표준화된 구조를 따르나, 일부 데이터는 이러한 기준에서 벗어나는 특성을 보임
    • 전체 스키마를 소수의 예외 사례로 설계하는 것을 비효율적일 수 있으므로, 이상치 패턴에서는 표준 데이터와 예외 데이터를 별도의 방식으로 관리할 것을 권장

 

  • 이러한 패턴의 실제 적용 사례로 교육기관의 수강 관리 시스템을 살펴볼 수 있음
    • 대다수 학생은 정규 교육과정에 따라 표준화된 과목을 이수하지만, 일부 학생들은 특수교육 필요성이나 심화 학습 프로그램으로 인해 비정규 과목을 수강하게 됨


 

9. 사전 할당 패턴

  • 문서 구조가 사전에 정의되어 있고 애플리케이션이 해당 구조에 데이터만 입력하면 되는 상황에서는 사전 할당 패턴이 최적의 선택
  • 몽고DB 환경에서 필요한 저장 공간과 문서를 미리 생성해 둠으로써 데이터의 추가와 갱신 프로세스를 효율화할 수 있으며 이러한 접근 방식은 시스템 오버헤드를 최소화하고 안정적인 쓰기 작업을 보장함
  • 이러한 패턴의 실제 적용 사레로 도시별 일일 기상 데이터를 관리하는 기상 정보 시스템을 들 수 있음
    • 매월 초에 시스템은 도시별로 해당 월의 전체 일자에 관한 플레이스홀더를 포함하는 문서를 사전에 생성함


 

10. 부분집합 패턴

  • 미리 정의된 페이지 크기를 갖는 리뷰 시스템에서 데이터 접근성을 최적화하는 방법을 제시하는 패턴
  • 특히 문서의 상당 부분이 실제 애플리케이션에서 활용되지 않는 대용량 문서를 처리할 때 효과적이며 이를 통해 시스템 자원을 효율적으로 활용하고 사용자 경험을 개선할 수 있음
  • 도서관 관리 시스템을 예로 들 수 있으며 각 도선에는 수백 개의 리뷰와 연결되어 있으나, 도서 목록 화면에서는 신속한 정보 탐색을 위해 최근 작성된 5개의 리뷰만을 표시함


 

11. 트리 패턴

  • 계층적 관계를 지닌 데이터 구조를 효과적으로 구현하는 방법을 제시하는 패턴
  • 데이터가 상위-하위 관계를 형성하거나 트리 형태로 구성되어야 할 때에 특히 적합한 패턴
  • 참조 방식이나 임베딩 기법을 활용하여 조직 구조도, 파일시스템, 댓글 계층 구조 등을 체계적으로 표현할 수 있음
  • 실제 적용 사례로 온라인 포럼 플랫폼을 들 수 있음
    • 사용자들은 게시물에 관한 댓글을 작성할 수 있으며, 각 댓글에 관한 답글을 통해 계층적인 토론 구조를 형성하게 됨


 

정리

  • 각각의 패턴은 특정 상황에서 최적의 성능과 확장성을 달성할 수 있도록 설계되었음
    • 대규모 데이터 처리가 필요한 경우에는 사전 게산 패턴
    • 계층적 데이터 구조가 필요한 경우에는 트리 패턴을 활용할 수 있음
    • 이러한 패턴들을 적절히 조합하고 활용함으로써, 애플리케이션의 특성과 요구사항에 최적화된 데이터베이스 구조를 구축할 수 있음

 

참고

마스터링 몽고DB 7.0

 

 

반응형

'DB > 마스터링 몽고DB 7.0' 카테고리의 다른 글

[7장] 몽고DB 고급 쿼리  (0) 2025.07.15
[5장] CRUD 작업과 기본 쿼리  (1) 2025.07.11
[4장] 몽고DB 연결  (0) 2025.07.11
[3장] 개발자 도구  (0) 2025.07.10
[2장] 몽고DB 아키텍처  (0) 2025.07.05