M:N 관계
Programming/데이터베이스

M:N 관계

M:N 관계

M:N 관계는 관계를 가진 양쪽 당사자 모두에서 1:M관계가 존재할 때 나타나는 모습이다. 학생과 과목의 관계를 예로 들 수 있다. 학생 입장에서는 여러 과목을 수강할 수 있고, 과목 입장에서 보면 여러 학생이 하나의 과목을 선택할 수 있다. 즉, 어느 쪽에서 봐도 다:다 관계가 성립된다.

 

이 관계는 선천적으로는 테이블과 테이블 사이에 특별한 관계가 없다. 각 테이블은 스스로 존재할 뿐이다. 그런데 이들 사이에 어떤 관계를 맺어 줌으로써 관계가 형성된다.

 

1. M:N 관계의 문제점

 

M:N 관계를 그림으로 그려보면 다음과 같다.

위 그림을 보면 각 테이블마다 PK가 존재하는 걸 볼 수 있다. 그러나 테이블 간의 관계가 성립되려면 PK 이외에도 FK가 존재해야 한다. FK를 생성한 테이블은 다음과 같다.

FK를 집어넣어 테이블 간의 관계를 표현할 때 PK 중복이라는 문제가 발생한다. 위 그림에서 '홍길동'이라는 학생이 A, B과목을 동시에 수강하고 있기 때문이다. 학생 테이블에 FK를 넣은 경우 뿐만 아니라, 과목 테이블에 FK를 넣었을 때에도 PK 중복이라는 문제는 피할 수 없다.

=> 결국 M:N 관계를 표현하기 위해서는 또 하나의 테이블이 필요하다.

 

2. 관계 테이블의 PK 구성 방법

관계 테이블의 PK를 구성하는 방법에는 크게 독립형PK를 이용하는 방법과 상속형PK를 이용하여 구성하는 방법으로 나뉜다. 이 둘의 차이점은 독립형PK를 이용할 때엔 중복을 허용한다는 점이다. 예를 들어, 독립형PK를 사용하게 되면, 1번 홍길동 학생이 국어를 듣는 경우가 2번 발생할 경우(ex. 재수강)를 허용한다. 

  1)  독립형PK

관계 테이블의 독립형PK

  2)  상속형PK

상속형PK를 이용해 관계 테이블을 구성할 때에는 중복이 허용되지 않는다. 즉, 홍길동 학생이 국어를 듣는 경우 (1, A)가 두번 나타나는 것을 허용하지 않는다.

 

관계 테이블의 상속형PK

  3)  상속형PK와 보조키(alternate key)를 사용

보조키를 사용하게 되면 쿼리문을 날릴 때 편해진다. 예를 들어 FK가 여러개일 경우

SELECT * FROM 수강신청 WHRER 학생ID = '1' AND 과목ID = 'A' AND f3 = '1' AND f4 = '1' 처럼 FK를 모두 적어야지만 원하는 조건으로 SELECT 할 수 있는데,

보조키를 사용하면   SELECT * FROM 수강신청 WHRER Seq = 5 처럼 간편해진다.

보조키의 속성은 PK와 같다.(UNIQUE, NOT NULL)