속성이 없는 다대다(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)
);
이론적으로는 속성이 없는 다대다 관계가 존재할 수 있지만, 실무에서는 비즈니스 요구사항을 구체화하는 과정에서 대부분 숨겨진 속성이 발견된다.
따라서 다대다 관계를 발견하면, "이 관계에 포함될 정보는 없을까?"라고 한 번 더 질문하는 습관을 들이는 것이 좋은 모델을 만드는 비결이다. 이는 연결 테이블이 단순한 기술적 해결책을 넘어, 그 자체로 중요한 비즈니스 개념(수강 기록, 주문 항목, 평가 정보 등)을 담는 핵심 엔티티임을 의미한다
'데이터 베이스 > 설계 1편, 현대적 데이터 모델링 완전 정복' 카테고리의 다른 글
| Ch07. 논리적 모델링(4) - 식별, 비식별 관계의 일대다 (0) | 2026.06.27 |
|---|---|
| Ch07. 논리적 모델링(4) - 식별, 비식별 관계의 개념 (0) | 2026.06.27 |
| Ch06. 논리적 모델링(3) - 다대다 관계 속성 (0) | 2026.06.26 |
| Ch06. 논리적 모델링(3) - 다대다 관계 연결 테이블 (0) | 2026.06.26 |
| Ch06. 논리적 모델링(3) - 다대다 관계 모델의 한계 (0) | 2026.06.26 |