blog post cover

ERD 및 구조

성능 이야기는 결국 조인 경로에서 시작된다. gym_booking 스키마의 핵심 병목은 user_memberships에서 발생한다.


ERD

ERD 다이어그램

erDiagram
    SIDO_REGIONS ||--o{ SIGUNGU_REGIONS : contains
    SIGUNGU_REGIONS ||--o{ EMD_REGIONS : contains
    EMD_REGIONS ||--o{ GYMS : located_in

    EXERCISE_TYPES ||--o{ GYM_EXERCISE_TYPES : provides
    GYMS ||--o{ GYM_EXERCISE_TYPES : offers

    GYMS ||--o{ MEMBERSHIPS : sells
    USERS ||--o{ USER_MEMBERSHIPS : buys
    MEMBERSHIPS ||--o{ USER_MEMBERSHIPS : purchased_as

    GYMS ||--o{ TRAINERS : employs
    EXERCISE_TYPES ||--o{ TRAINER_EXERCISE_TYPES : can
    TRAINERS ||--o{ TRAINER_EXERCISE_TYPES : mapped_to

    GYMS ||--o{ GYM_CLASSES : schedules
    EXERCISE_TYPES ||--o{ GYM_CLASSES : category
    GYM_CLASSES ||--o{ GYM_CLASS_TRAINERS : assigned
    TRAINERS ||--o{ GYM_CLASS_TRAINERS : teaches

핵심 엔티티 요약

지역 계층

  • sido_regionssigungu_regionsemd_regions
  • 지역 기반 검색/집계를 쉽게 하기 위한 정규화 계층

헬스장과 제공 종목

  • gymsemd_regions에 속한다.
  • exercise_types와 다대다 관계를 gym_exercise_types로 분리한다.

회원/회원권

  • membershipsgyms에 소속된다.
  • usersmembershipsuser_memberships로 연결된다.
  • 병목의 중심은 user_memberships다.

트레이너/수업

  • trainersgyms에 소속된다.
  • 수업은 gym_classes, 담당자는 gym_class_trainers로 연결된다.

자주 쓰는 조인 경로

  • 헬스장별 활성 회원 수
    • user_memberships → memberships → gyms
  • 사용자 회원권 목록
    • users → user_memberships → memberships → gyms
  • 수업 담당 트레이너
    • gym_classes → gym_class_trainers → trainers

이 조인 경로를 이해하면, 왜 특정 테이블이 병목이 되는지 한 눈에 들어온다.


성능 관점에서의 특징

  • user_memberships는 행 수가 가장 크고, 필터 조건이 항상 붙는다.
  • memberships는 헬스장별 집계의 중심이라 gym_id 인덱스가 중요하다.
  • gym_classes는 시간 조건과 함께 쓰이는 경우가 많아 복합 인덱스가 유리하다.

이 구조를 기반으로 더미 데이터를 넣고, EXPLAIN을 확인해 보자.