피드로 돌아가기
Modeling 1 enrollment = N seats: when a table name lies
Dev.toDev.to
Database

스키마 변경 비용 최소화를 위한 Invariant Rule 기반 데이터 모델링 전략

Modeling 1 enrollment = N seats: when a table name lies

Michel Faure2026년 5월 5일7intermediate

Context

수강 신청(Enrollment)을 하나의 행으로 정의한 inscriptions 테이블 설계로 인해, 1인 다과목 수강생이 중복 집계되는 데이터 왜곡 발생. 테이블 명칭과 실제 저장 데이터(Seat) 간의 의미론적 괴리로 인한 쿼리 오류 및 데이터 무결성 저하 상황 분석.

Technical Solution

  • 저장 데이터와 계산 데이터의 분리를 통한 도메인 모델 재정의
  • 물리적 스키마 변경 대신 '1 Row = 1 Seat'라는 Documented Invariant 규칙 도입
  • DISTINCT contact_id 활용을 통한 상업적 등록 인원(Enrollment)의 동적 계산 방식 채택
  • ON CONFLICT 구문을 활용한 Multi-course Upsert 로직으로 데이터 일관성 확보
  • 인프라화된 테이블명 변경의 리스크(FK, RLS, Trigger 영향)를 회피하기 위한 Semantic Clarification 전략 수행
  • ADR(Architecture Decision Record) 작성을 통한 구조 변경 임계점 명시 및 관리

1. 테이블 명칭과 실제 저장 데이터의 의미가 일치하는지 검토

2. 스키마 변경 비용이 과도할 경우, 데이터의 성격(Stored vs Computed)을 명확히 구분하여 정의

3. 복합 유니크 인덱스(Composite Unique Index)를 통한 중복 방지 및 Upsert 전략 수립

4. AI 코딩 어시스턴트(Claude 등)의 Context 파일에 도메인 특이 규칙을 명시하여 휴먼 에러 방지

원문 읽기