DB를 설계하는 과정에서 다대다 관계는 흔히 등장 할 수 있다.
근데 공부를 하다보니, 관계형 데이터베이스는 M:N관계를 사용하면 안된다고 하는데, 그 이유가 무엇인지 자세히 공부하고 정리할 글을 작성한다 !
예시로 다음과 같은 테이블이 두개 있다고 가정하자.
학생 : 과목 예시

이 테이블에서 학생 테이블의 컬럼은 학번(pk), 이름 , 학과로 구성되어 있고, 과목 테이블은 과목코드 (pk), 과목명, 담당교수 컬럼으로 구성되어 있다.
여기서 두 테이블간의 관계를 보면, 한 학생은 여러 과목을 수강할 수 있고, 한 과목은 여러 학생이 수강할 수 있다.
만약 김철수는 자바와 C프로그래밍을 신청하고, 홍길동은 C와 파이썬을 수강신청 했다고 가정하자.
이 데이터를 서로 연관있는 데이터로 만들기 위해선 학생 테이블이 과목 테이블을 참조하던, 과목 테이블이 학생 테이블을 참조 해야한다(외래키).
그 결과는 아래와 같을 듯 하다.

발생하는 문제점들
문제점이 바로 보이는가? 여기저기 테이블에서 중복되는 데이터가 보이기 시작했다.
제일 큰 문제는 각 테이블의 기본키가 제 구실을 못하게 되었다. -> 즉 기본키 만으로는 데이터를 구분할 수 없게 되었기 때문에 기본키 원칙이 위배 되었다. 학생 테이블에선 더이상 학번만으로는 데이터를 구분할 수 없게 되었고 과목 테이블도 과목코드만으로 데이터를 구분할 수 없게 되었다.
두번째 문제는 데이터를 어떤 테이블에서 찾아야할지 모호함이 발생했다. 예를 들어 김철수의 수강정보를 찾고 싶다면 학생 테이블과 과목 테이블 중 어떤 테이블을 선택해야할까?
마지막 문제로 만약 김철수가 프로그래밍의 재미에 빠져 컴퓨터 공학과로 전과하게 된다면 모든 테이블의 데이터를 일일히 수정해줘야하는 문제점이 존재한다.
이러한 문제점을 한방에 해결하는 방법이 바로 중간테이블을 통해 M:N 관계를 해소하는 것이다.
중간 테이블 작성

중간테이블(혹은 연관테이블)로 M:N 관계를 반드시 해소해줘야 한다.
1. 각 테이블을 아예 변경하지 않았기 때문에 PK 들은 제 구실을 다시 할 수 있게 되었다.
2. 학생은 학생 테이블, 과목은 과목 테이블에서 찾으면 되고, 예를 들어 김철수의 수강과목에 대한 데이터는 학생_과목 데이터에서 찾으면 되기 때문에 모호함도 사라졌다.
3. 김철수가 전과를 하더라도 학생테이블에서 학과 컬럼 데이터 하나만 수정해주기 때문에 실수로 데이터를 변경하지 못할 가능성이 사라지게 된다.
'DataBase > Database Modeling' 카테고리의 다른 글
| [Database] 3정규형 (0) | 2025.07.24 |
|---|---|
| [Database] 1정규형 & 2정규형 (0) | 2025.07.24 |
| [DB Modeling] DB 설계시 필수 덕목 (이상현상 -> 정규화) (0) | 2025.05.01 |
| [DB Modeling] 데이터 베이스 네이밍 베스트 프랙티스 (0) | 2025.05.01 |
| [DB Modeling] Primary Key (PK), Foreign Key(FK) (0) | 2025.05.01 |