M:N을 쓰면 왜 안되나요?

froajnzd·2024년 7월 23일
0

database

목록 보기
3/3
post-thumbnail

RDB 세상에서 M:N을 쓰지 말라는 얘기를 수도 없이 많이 들어왔을 것이다.
왜 테이블간 M:N 관계를 만들지 말라는 걸까?

예를 들어서 설명해보자

영화는 여러 배우를 섭외할 수 있고, 배우는 여러 영화에 출연할 수 있는 영화와 배우 관계성을 생각해보았다.

영화와 배우는 M:N 관계를 가지고 있다.

이를 테이블로 만들어보자

여기서 영화와 배우 관계의 관계성을 나타내기 위해 FK를 두어서 표현해보았다.
그랬더니 영화, 배우 어떤 테이블에 FK를 넣든 '한 행의 한 컬럼'='한 칸'에 값이 여러 개 들어가는 문제가 생겼다.

이는 속성의 원자성을 위배한다고 할 수 있다.

그럼 속성의 원자성을 없애보자!

속성의 원자성을 없애보고자 리스트 형태로 있던 영화와 배우 행을 더 만들었다.

그랬더니?
영화 테이블에서는 '두근두근 내 인생'과 '전우치'가, 배우 테이블에서는 '강동원'이 중복으로 들어가는 문제가 생겼다!!

그래서, 뭐가 문제인데?

이렇게 테이블을 사용하면 되는거 아닌가! 라고 한다면,
한가지 상황을 생각해보자.

<두근두근 내 인생>에 '홍길동' 배우를 출연 취소하려고 한다.

그럼 "배우 테이블"에서 홍길동 배우를 지워야 하나?

=> 이렇게 하면 홍길동 배우는 배우 리스트에서 아예 없어지는 행위인 것이다.

=> "배우 테이블" 뿐만 아니라, 홍길동 배우의 PK가 "영화 테이블"의 FK에 저장되어 있기 때문에 해당 컬럼도 같이 지워야 한다.

해결 방법은?

테이블간 관계를 M:N으로 설정하기보다는
한 개의 테이블을 더 생성하여 1:M, 1:N의 관계로 만드는 것이 더 테이블 관리를 용이하게 만드는 방법이다.

이렇게 만들게 되면,

영화테이블과 출연 테이블은 1:N 관계,
배우테이블과 출연 테이블은 1:M 관계가 형성된다.

그럼 M:N 관계는 절대 쓸 수 없나?

절대적으로 다대다 관계 테이블을 구현하지 못한다는 것은 아니다.!
그러나 M:N 관계에서는 복잡한 상호작용을 포함할 수밖에 없다보니, 이보다는 1:N 관계에서의 데이터의 조회와 유지보수가 더 쉬워진다.

TIP

  • N:1 보다 1:N 을 기준으로 생각한다. 직관적으로 이해하기 쉬워진다!!
profile
Hi I'm 열쯔엉

0개의 댓글