다대다 (M:N) 관계
두 개의 테이블이 서로의 행에 대해 여러개로 연관 되어 있는 상태를 다대다(M:N)관계라고 한다. 예를 들어 한명의 학생이 여러 수업을 수강하고, 한 수업은 여러 학생을 수용하는데 이를 ERD로 표현하면 다음과 같다.
ERD (Entity Relationship Diagram)
: 개체-관계 모델. 테이블간의 관계를 설명해주는 다이어그램이라고 볼 수 있으며, 이를 통해 프로젝트에서 사용되는 DB의 구조를 한눈에 파악할 수 있다. 즉, API를 효율적으로 뽑아내기 위한 모델 구조도라고 생각하면 된다.
다대다(M:N) 구현하기
논리적으로 다대다관계의 표현은 가능하지만 2개의 테이블만으로 구현하는 것은 불가하다. 다대다 관계를 실제로 구현하려면 각 테이블의 Primary Key를 외래키(FK)로 참조하고 있는 연결 테이블(매핑 테이블)을 사용해야 한다.
- '학생테이블'과 '학생_수업테이블'이 일대다 관계로 연관되어 있고, '학생_수업테이블'과 '수업테이블'이 다대일 관계로 연관되어 있다.
예를 들어 '철수'는 '국어' , '영어', '수학' 3가지의 수업을 수강하고 있고, '수학'이라는 수업은 '철수', '영희', '미자'라는 학생을 수용하고 있는데 테이블에 입력하면 다음과 같다.
[학생]
학생 이름 | 학생 코드 |
철수 | 1 |
영희 | 2 |
미자 | 3 |
[학생_수업] - 연결 테이블(매핑 테이블)
학생 코드 | 수업 코드 |
1 | a |
1 | b |
1 | c |
2 | c |
3 | c |
[수업]
수업명 | 수업 코드 |
국어 | a |
영어 | b |
수학 | c |
만약 철수가 듣고 있는 수업을 알고 싶다면, 철수의 학생코드 1을 조건문으로 학생_수업 테이블을 조회한다.
만약 영희가 국어 수업을 듣는다면, 영희의 학생 코드 2와 국어 수업코드 a를 학생_수업 테이블에 삽입한다.
TIP 🔍) 테이블간 관계를 이해하기 어려울 때
1. 관계를 생각할 때 테이블이 아닌 '한 행'을 기준으로 생각하자. 따라서 테이블 명도 '학생 목록' , '수업 목록'이 아닌 한 행을 대표할 수 있는 이름인 '학생' , '수업'으로 해야 한다.
2. 논리적으로 생각할 땐 연결 테이블은 생각하지 않는다.
- 철수의 학생 코드는 학생_수업 테이블에 여러 개 존재한다 (XXXX)
- 철수는 국어, 영어, 수학 수업을 수강한다 (O)
3. 항상 일대다(1:N) 기준으로 생각한다. 다대일(N:1)보다 직관적으로 이해하기가 쉽다.
- 철수가 여러 수업을 수강한다 (O)
- 국여,영어,수학은 철수를 수용한다. (X)
참고 자료
https://siyoon210.tistory.com/26