데이터 베이스/설계 1편, 현대적 데이터 모델링 완전 정복

Ch06. 논리적 모델링(3) - 다대다 관계 개념적, 논리적 모델링

webmaster 2026. 6. 26. 20:11

속성이 없는 다대다(M:N) 관계 예시

속성이 없는 다대다 관계는 엔티티를 연결하는 행위 자체에 추가적인 정보가 필요 없는 경우이다.

 

시나리오: 학생은 여러 과목을 수강할 있고, 과목은 여러 학생이 수강할 있다.

 

개념적 모델링

개념적으로 학생과 과목은 직접 다대다(M:N) 관계로 연결된다. 학생이 어떤 과목을 듣는다는 사실 외에는 별도의 데이터가 없다. 이런 경우 연관 엔티티로 표현하지 않는다.

"학생 (M) >---< (N) 과목"
  • 엔티티: 학생(Student), 과목(Course)
  • 관계: 학생은 과목을 "수강한다(enrolls in)". 이 관계는 다대다(M:N)이다.

 

논리적 모델링

논리적 모델링에서는 다대다 관계를 해소하기 위해 중간에 수강(ENROLLMENT)이라는 연결 테이블을 만든다. 테이블은 어떤 학생이 어떤 과목을 수강하는지를 기록하는 역할만 한다.

"학생 (1) --< (N) 수강 (N) --< (1) 과목"

 

테이블 구조

  • student 테이블
    • student_id(PK)
    • student_name
  • course 테이블
    • course_id(PK)
    • course_name
  • enrollment(연결 테이블)
    • enrollment_id(PK)
    • student_id(FK, student 참조)
    • course_id(FK, course 참조)

enrollment 테이블에는 엔티티의 기본 (PK) 외래 (FK) 가져와 연결하는 역할만 , 외의 속성 (컬럼)은 없다.

 

 

정리 - 속성이 없는 경우 모델링

  • 개념적 모델링
    • "학생 (M) >---< (N) 과목"
    • 개념적 모델링은 특정 구현 기술에 종속되지 않는다. 자바 같은 객체지향 언어, NoSQL, 관계형 데이터베이스 모두 사용할 수 있다.
    • 속성이 없는 경우 개념적 모델링에서는 별도의 연관 엔티티 없이 단순히 다대다 관계만 표현한다.
  • 논리적 모델링
    • "학생 (1) --< (N) 수강 (N) --< (1) 과목"
    • 관계형 데이터베이스 이론에 맞추어 모델링해야 한다. 따라서 다대다 관계는 반드시 중간 테이블을 사용해서 일대다, 다대일 관계로 풀어내야 한다.
      • 따라서 연결 테이블(enrollment)을 도입해야 한다.
    • 자바, NoSQL 같은 곳에서는 이런 다대다 관계를 별도의 장치 없이 직접 표현할 수 있다.

 

속성이 있는 다대다(M:N) 관계 예시

속성이 있는 다대다 관계는 엔티티를 연결하는 행위 자체에 저장해야 중요한 정보가 있는 경우이다.

 

시나리오: 사용자는 여러 영화에 대해 평점을 남길 있고, 영화는 여러 사용자로부터 평점을 받을 있다

 

개념적 모델링

개념적으로 사용자와 영화의 관계에는 "평점(rating)" "평가일시(rated_at)"라는 중요한 속성이 포함된다. 속성들은 사용자나 영화 어느 한쪽에 속한 것이 아니라, "사용자가 영화를 평가하는 행위"에 속한다. 따라서 관계 자체가 하나의 엔티티처럼 취급되며, 이를 연관 엔티티(Associative Entity)라고 한다.

"사용자 (1) --< (N) 평가 (N) --< (1) 영화"
  • 엔티티: 사용자(User), 영화(Movie)
  • 연관 엔티티: 평가(Rating)
    • 속성: 평점, 평가일시
  • 관계
    • 사용자와 평가는 "1:N 관계"
    • 영화와 평가는 "1:N 관계"

논리적 모델링

논리적 모델링에서는 연관 엔티티 평가가 MOVIE_RATING이라는 연결 테이블로 만들어진다. 테이블은 엔티티를 연결하는 외래 (FK) 함께 관계의 속성인 평점(rating), 평가일시(rated_at) 컬럼을 포함한다.

"사용자 (1) --< (N) 평가 (N) --< (1) 영화"

 

테이블 구조

  • user 테이블
    • user_id(PK)
    • username
  • movie 테이블
    • movie_id(PK)
    • title
  • movie_rating(연결 테이블)
    • movie_rating_id(PK)
    • user_id(FK, user 참조)
    • movie_id(FK, movie 참조)
    • rating(관계 속성)
    • rated_at(관계 속성)

 

정리 - 속성이 있는 경우 모델링

  • 개념적 모델링
    • "사용자 (1) --< (N) 평가 (N) --< (1) 영화"
    • 개념적 모델링은 특정 구현 기술에 종속되지 않는다. 자바 같은 객체지향 언어, NoSQL, 관계형 데이터베이스 모두 사용할 수 있다.
    • 속성이 있는 경우 개념적 모델링에서는 연관 엔티티가 등장하기 때문에 다대다 관계가 일대다, 다대일 관계로 표현된다.
  • 논리적 모델링
    • "사용자 (1) --< (N) 평가 (N) --< (1) 영화"
    • 관계형 데이터베이스 이론에 맞추어 모델링해야 한다.
      • 개념적 모델링 단계에서 연관 엔티티의 등장으로 이미 다대다 관계가 일대다, 다대일 관계로 풀려있다.
      • 따라서 논리적 모델링 단계에서는 관계 그대로 외래키만 추가하면 된다

이처럼 관계 자체의 속성이 존재하면, 연결 테이블은 단순한 다리 역할을 넘어 자체로 의미 있는 데이터를 저장하는 중요한 테이블이 된다.

 

이론과 실무의 차이: 속성 없는 다대다 관계

 

앞서 "학생" "과목" 관계를 속성이 없는 다대다 관계의 예시로 들었다. 이론적으로는 완벽한 예시이다. 하지만 실무 데이터베이스를 설계하는 관점에서  관계를  깊이 파고들어 보면 어떨까? 우리가 실제 "수강신청 시스템"을로 만든다고 상상해 보자. 단순히 어떤 학생이 어떤 과목을 듣는다는 사실만 저장하면 충분할까? 아마 다음과 같은 질문들이 바로 떠오를 것이다.

  • 학생이 이 과목을 언제 신청했는가? (수강신청일)
  • 해당 과목의 성적은 어떻게 되는가? (성적)
  • 현재 수강 상태는 어떤가? (예: "수강신청", "수강완료", "수강취소")(상태)

바로 이 "수강신청일", "성적", "상태"와 같은 데이터가 "학생"과 "과목" 사이 관계에서 발생하는 숨겨진 속성이다. 이 정보들은 학생 엔티티에도, 과목 엔티티에도 속하지 않는다. 오직 "학생이 과목을 수강하는 행위"에만 종속되는 정보다.

 

결과적으로 개념적 모델링 단계에서 속성을 관리하는 수강(enrollment)이라는 연관 엔티티가 중간에 등장해야 하는 것이다. 따라서 실무에서는 수강(enrollment) 테이블이 다음과 같이 확장될 가능성이 매우 높다.

 

테이블 확장 예(enrollement)

CREATE TABLE enrollment (
	enrollment_id BIGINT NOT NULL AUTO_INCREMENT, -- 고유 ID
    student_id BIGINT NOT NULL, -- 학생 FK
    course_id BIGINT NOT NULL, -- 과목 FK
    enrollment_dt DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 수강신청일 (숨겨진 속성)
	grade VARCHAR(2) NULL, -- 성적 (숨겨진 속성)
    status VARCHAR(20) NOT NULL DEFAULT 'ENROLLED', -- 수강 상태 (숨겨진 속성)
    PRIMARY KEY (enrollment_id),
	CONSTRAINT fk_enroll_student FOREIGN KEY (student_id) 
    	REFERENCES student(student_id),
	CONSTRAINT fk_enroll_course FOREIGN KEY (course_id) 
    	REFERENCES course(course_id)
);

 

이론적으로는 속성이 없는 다대다 관계가 존재할 있지만, 실무에서는 비즈니스 요구사항을 구체화하는 과정에서 부분 숨겨진 속성이 발견된다.

 

따라서 다대다 관계를 발견하면, " 관계에 포함될 정보는 없을까?"라고 질문하는 습관을 들이는 것이 좋은 모델을 만드는 비결이다. 이는 연결 테이블이 단순한 기술적 해결책을 넘어, 자체로 중요한 비즈니스 개념(수강 기록, 주문 항목, 평가 정보 ) 담는 핵심 엔티티임을 의미한다