폴더 구조 DB 스키마 설계

2024. 4. 8. 19:43·DB

폴더 구조 DB 스키마 예시 목록

 

Closure Table

  • Folders:
    • folder_id
    • folder_name
  • FolderRelationships:
    • ancestor_id
    • descendant_id
    • depth

장점

  • 참조 완결성
    • ancestor_id, descendant_id를 통해 실제 노드의 id를 참조
  • 서브트리 사용 용이
  • 깊이에 따른 성능 문제
    • 트리 깊이가 늘어나도 일관된 성능 유지 가능

단점

  • 공간 복잡도 증가
    • 노드 간 관계를 저장하기에 데이터가 늘어남에 따라 공간 복잡도 증가
  • 데이터 양 증가
    • 관계 데이터가 O(n²)

Closure Table - Store Hierarchical Data Seamlessly | PostgreSQL

Path Enumeration

테이블명:

  • Folders

필드명:

  • folder_id
  • folder_path
  • folder_name

장점

  • 경로 가시성
    • path를 통해 전체 계층 구조를 명확히 알 수 있다.

단점

  • 참조 완결성 부재
    • 잘못된 path 입력될 시 오류 파악이 어렵다.

Nested Set Model

테이블명:

  • Folders

필드명:

  • folder_id
  • lft
  • rgt
  • folder_name

장점

  • 읽기 성능
    • 전체 또는 부분 트리 조회가 빠르다.
  • 조인 최소화
    • 깊이가 3단계 이상인 case의 경우, 데이터 검색을 위한 조인 회수가 줄어든다.

단점

  • 참조 완결성 부재
    • left right값이 특정 노드의 id를 참조하지 않는다.
  • 업데이트 비용
    • add/delete/update시 많은 값들이 수정되어야한다.

고민

각각의 구조 마다 장단점이 있지만 참조 완결성을 가지고 있고 쿼리 효율성을 가지는 클로저 테이블 구조가 가장 추천되는 것으로 파악하였다.

클로저 테이블은 폴더 구조 변경시에도 효율적이며 구조 변경에 상당히 용이하다.

그러나 관계 데이터 양이 많아지기에 저장 공간이 더 필요해진다.

성능 ↔ 많아지는 데이터 양

트레이드 오프라고 생각된다.

따라서 복잡한 쿼리와 큰 규모의 데이터셋을 처리하는 것에는 클로저 테이블이 가장 효율적인 구조로 생각된다.

 

참고

Models for hierarchical data

'DB' 카테고리의 다른 글
  • MySQL 아키텍처 (Real MySQL 8.0 4장)
  • Real MySQL 8.0 1, 2, 3장
  • [Postgresql] 외래키 참조 테이블 조회 방법
  • DB PK UUID VS auto increment(serial)
minseok__
minseok__
  • minseok__
    minseok_study
    minseok__
  • 전체
    오늘
    어제
    • 분류 전체보기 (90)
      • JAVA (1)
      • Kotlin (0)
      • CS (1)
      • SQL (7)
      • Python (2)
      • Docker (13)
      • Typescript (0)
      • Javascript (1)
      • AWS (6)
      • NestJS (1)
      • ElasticSearch (1)
      • 트러블슈팅 (10)
      • DB (6)
      • 알고리즘 (5)
      • Redis (1)
      • Postgresql (1)
      • AI (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    docker
    mysql 아키텍처
    amazon linux 2023
    EC2
    SQL
    윈도우
    error: relation "batch_job_instance" does not exist
    response data
    bigquery
    window
    openssh 8.8
    useswrinfinite
    node.js 20
    쿠버네티스
    반환 데이터
    userauth_pubkey: key type ssh-rsa not in pubkeyacceptedalgorithms
    빅쿼리
    createMany
    외래키 참조
    k8s
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
minseok__
폴더 구조 DB 스키마 설계
상단으로

티스토리툴바