Programming Summary

DB) M:N을 왜 사용하면 안되는가? 본문

프로 디지털 아카데미 4기

DB) M:N을 왜 사용하면 안되는가?

쿠키롱킹덤 2024. 7. 23. 17:27

1:1과 1:N과 M:N

1:1

1대 1 관계란 어느 엔티티 쪽에서 상대 엔티티와 반드시 단 하나의 관계를 가지는 것을 말한다.
예시) Student : Seat

왜 1대 1인가?

  • 한 명의 학생이 한 개의 자리만 소유할 수 있고, 한 자리는 여러 명의 학생이 소유할 수 없기 때문.

1:N

1:N 관계는 한 쪽 엔티티가 관계를 맺은 엔티티 쪽의 여러 객체를 가질 수 있는 것을 의미한다.
예시) Student : ProjectTeam

왜 1대 N인가?

  • 팀도 별도의 테이블로 분리해야 하고, 하나의 팀에는 여러명의 Student가 속하고, 하나의 Student는 단 하나의 팀에만 속하기 때문.

N:M

N:M 관계는 관계를 가진 양쪽 엔티티 모두에서 1:N 관계를 가지는 것을 말한다.
예시) Student : StudyGroup

왜 M대 N인가?

  • 하나의 스터디 그룹에는 여러명이 속할 수 있고, 한 명의 Student는 여러 개의 스터디 그룹에 속할 수 있기 때문.

M대 N일 경우 어떻게 Foreign Key를 처리해야할까?

다음 그림을 보자.

레코드 추가

 

만약 한명의 학생이 여러 StudyGroup에 속하기 위해 FK 컬럼만 다른 레코드를 새롭게 추가한다면, FK를 제외한 다른 데이터들이 중복으로 들어가게 되어 유지/보수가 어려워 진다.

그럼 다음과 같이 작성하면 어떨까?

 

컬럼 추가


하나의 학생 레코드에서 여러 StudyGroup FK를 갖도록 하기 위해 컬럼을 늘렸다. 딱 봐도 문제점이 많아 보인다. 먼저 비효율적인 null이 너무 많이 발생한다. 또한 속할 수 있는 StudyGroup의 수가 변경될 때마다 스키미가 변경되어야 한다. DB스키마를 조작하는 것은 그리 바람직한 행위가 아니고 어떤 문제가 추가로 발생할 지 모르므로 최대한 줄이는 것이 좋다.

이 외에도 한 컬럼에 값을 여러 개 저장하는 등의 방법을 쓸 수 있겠지만, 아마 만족스러운 답은 아닐 것이다.\

 

그렇기에 우리는 M대 N을 1대 N과 1대 M으로 나누고 중간에 서로를 연결해주는 중간 테이블을 두는 것이 가장 나은 방법이라고 할 수 있다.