피드로 돌아가기
Attempt history in the teacher dashboard — the scalar subquery pattern
Dev.toDev.to
Database

Scalar Subquery 도입을 통한 데이터 무결성 보장 및 p99 150ms 달성

Attempt history in the teacher dashboard — the scalar subquery pattern

Oscar Rieken2026년 5월 21일5intermediate

Context

학생별 학습 시도 이력(Attempt History) 제공을 위해 MistakeEvent 테이블과의 조인이 필요한 상황. 단순 LEFT JOIN 사용 시 MistakeEvent의 중복 데이터 발생 가능성으로 인한 결과 행의 의도치 않은 증폭(Row Multiplication) 위험 존재.

Technical Solution

  • Scalar Correlated Subquery 채택을 통한 1:1 관계 강제 및 데이터 무결성 확보
  • Subquery 내 LIMIT 1 설정을 통해 스키마 변경이나 데이터 오류 발생 시에도 결과 행 수를 엄격히 제어
  • Application Layer가 아닌 Database Layer에서 불변성(Invariant)을 강제하는 구조 설계
  • (student_id, created_at) 복합 인덱스 구성을 통한 Correlated Subquery의 성능 저하 방지
  • 과잉 엔지니어링 방지를 위해 현재 트래픽 규모에서 OFFSET Pagination을 우선 적용하고 Cursor-based 전환 경로를 문서화
  • 역할 기반 접근 제어를 위해 Teacher 전용 엔드포인트를 분리하여 라우팅 수준에서 단순한 권한 검증 구현

1. Nullable 1:1 관계 조인 시 데이터 중복으로 인한 Silent Bug 가능성을 검토했는가

2. 성능 최적화 전 현재 데이터 규모와 p99 지표를 기반으로 적절한 페이지네이션 전략을 선택했는가

3. 복잡한 역할 기반 권한 체크를 단일 엔드포인트 내 분기문 대신 별도 라우트로 분리하여 단순화했는가

원문 읽기