둘셋 개발!

[RDBMS] M:N 테이블 설계 (특징, 예시, 테이블 설계 시 고려할 점) 본문

데이터베이스

[RDBMS] M:N 테이블 설계 (특징, 예시, 테이블 설계 시 고려할 점)

23 2023. 3. 19. 15:15

우선 m:n 테이블이 무엇인지 알아보자.


M:N 관계

: 양 쪽 모두 1:M 관계가 성립

 

예를 들어 학생테이블과 과목 테이블이 있다고 하자.

학생 테이블 입장에서 과목 테이블을 바라봤을 때 한 학생은 여러 개의 과목을 수강할 수 있다.

반대로 과목 테이블에서 학생 테이블을 바라봤을 때 한 과목은 여러 명의 학생이 수강할 수 있다.

그림으로 살펴보자

 

먼저 학생 테이블, 과목 테이블이 있다고 치자.

일단 관계를 맺기 전인 서로 독립적인 테이블이다.

여기서 학생 테이블과 과목 테이블 간의 관계를 맺어보고자 한다. 

그러면 학생 테이블에 과목 id를 가진 fk 컬럼을 추가하고, 과목 테이블에는 학생 id를 가진 fk 컬럼을 추가해본다.  

(✢ 주의 이렇게 하면 안됨!!!!)

 

잘못된 m:n 테이블 예시

이렇게 만들 수는 있다.

하지만 이것은 철저히 잘못 설계된 테이블이다.

학생 테이블에서 pk는 학생 id이기 때문에 uniqu해야 한다. 값이 유일해야 한다.

하지만 한 학생이 여러 과목을 수강 할 수 있으므로 학생 id값이 중복되게 된다.

과목 테이블도 마찬가지 이다.

 

이를 해결하기 위해서는 학생 테이블과 과목 테이블 사이에 또 하나의 테이블을 넣으면 된다.!

 

올바른 m:n 관계 테이블 예시

수강 테이블은 학생 테이블과 과목 테이블 각각 1:m의 관계를 만듬으로써, 학생 테이블과 과목 테이블의 m:n관계가 완성되었다!!

여기서 수강 테이블은 관계 테이블이다.


관계 테이블 설계할 때 !

위와 같이 관계 테이블을 설계 할 때 알아두면 좋은 것들이 몇가지 있다.

 

 

1. 관계 테이블의 이름 설정

관계 테이블의 이름을 설정할 때는 동사를 생각하면 편하다.

학생은 과목을 수강한다.

이렇게 문장을 만들 수 있다.

여기서 동사는 "수강" 이다.

 

 

만약 관계테이블이 필요한데 딱히 적당한 동사가 없으면 테이블의 이름을 합쳐서 짓는다. (ex: 학생+과목 = 학생과목 테이블)

 

2.  관계 테이블의 PK 설정

총 2가지 방법으로 pk를 설정할 수 있다.

1.  (FK+FK) 를 합친 것을 pk로 설정.  => 상속형 pk
2. pk 컬럼을 따로 생성  => 독립형 pk

    1. 상속형 pk

        위의 예시로 설명하자면, 수강 테이블의 pk를 학생id(fk)와 과목id(fk)를 묶어서 pk로 설정한다는 것이다. 

        여기서는 학생이 똑같은 과목을 여러번 수강할 수 없다는 문제가 생긴다.

        만약 1번 학생이 1번 과목을 한 번 더 수강하게 되면 pk에 중복이 생기기 때문이다.

 

 

   2. 독립형 pk

       따로 pk를 만드는 것이다. 

     

독립형 pk 예시

 

이렇게 설계하게 되면 한 학생이 똑같은 과목을 여러번 수강해도 문제가 발생하지 않는다.

 

그렇다고 해서 독립형 pk가 무조건 맞다는 것은 아니다. 상황에 맞게 해주면 된다. 

만약 '한 학생이 똑같은 과목을 여러번 수강하면 안된다! '라는 상황에서는 상속형 pk를 써줘도 괜찮고 

'한 학생이 똑같은 과목을 여러번 수강해도 된다!' 라는 상황에서는 상속형 pk를 쓰면 안된다.

 

 

➕ 보조키 사용

상속형 pk를 사용할 때 보조키를 사용하면 sql이 간결해진다.

만약 관계테이블의 pk를 (fk+fk+fk+fk+fk+fk)로 묶어서 사용한다고 가정하자.

그러면 한 레코드(행)를 찾을 때 select * from '테이블명' where f1 = '가' and f2= '다' and f3= '사' and f4 = '마',.... 

이렇게 길어질 수 있다.

 

이때 보조키를 달면

select * from '테이블명' where ak=45 

이렇게 간결한 sql을 쓸 수 있다.