피드로 돌아가기
Modéliser 1 inscription = N places : quand le nom d'une table ment
Dev.toDev.to
Database

테이블 명칭-데이터 불일치 해결을 통한 정밀한 수강 인원 집계 구현

Modéliser 1 inscription = N places : quand le nom d'une table ment

Michel Faure2026년 5월 5일7intermediate

Context

'1인 다과목 수강' 비즈니스 로직이 반영되지 않은 단순 1:1 매핑 구조의 inscriptions 테이블 사용. 테이블 명칭이 실제 저장 데이터(수강 좌석)와 상이하여 COUNT(*) 쿼리 시 실제 학생 수보다 많은 수치가 산출되는 데이터 무결성 오류 발생.

Technical Solution

  • inscriptions 테이블의 실질적 정체성을 '등록 행위'가 아닌 '수강 좌석(Place)'으로 재정의
  • 비즈니스 관점의 '등록' 개념을 물리적 저장소에서 분리하여 contacts 테이블의 상태값 기반 가상 뷰(Derived Data)로 처리
  • (contact_id, cours_id) 복합 Unique Index를 통한 중복 데이터 방지 및 무결성 확보
  • 데이터 정합성 보장을 위해 INSERT ... ON CONFLICT 구문을 활용한 Upsert 로직 적용
  • 인프라 영향도를 고려하여 테이블 리네이밍 대신 '문서화된 불변 규칙(Documented Invariant)'을 통한 시맨틱 해결책 채택

- 테이블 명칭이 비즈니스 엔티티와 실제 저장 데이터 간의 일치 여부를 검토하십시오. - 집계 쿼리 작성 시 `COUNT(*)` 대신 `COUNT(DISTINCT id)`를 사용하여 엔티티 중복 계산 가능성을 차단하십시오. - 스키마 변경 비용이 과다할 경우, ADR(Architecture Decision Record)에 해당 테이블의 실제 정체성을 명시하고 팀 내 공유하십시오. - 다대다 관계의 매핑 테이블 설계 시 복합 유니크 인덱스 설정 여부를 확인하십시오.

원문 읽기