성능 이야기는 결국 조인 경로에서 시작된다.
gym_booking스키마의 핵심 병목은user_memberships에서 발생한다.
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_regions→sigungu_regions→emd_regions- 지역 기반 검색/집계를 쉽게 하기 위한 정규화 계층
헬스장과 제공 종목
gyms는emd_regions에 속한다.exercise_types와 다대다 관계를gym_exercise_types로 분리한다.
회원/회원권
memberships는gyms에 소속된다.users와memberships는user_memberships로 연결된다.- 병목의 중심은
user_memberships다.
트레이너/수업
trainers는gyms에 소속된다.- 수업은
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을 확인해 보자.