다대다(Many to Many) 관계란 두 개체(Entity) 사이에 서로 여러 개의 관계가 성립하는 경우를 의미합니다. 대표적인 예로, 하나의 수업(Class)에는 여러 명의 학생(Student)이 포함될 수 있고, 동시에 한 명의 학생 역시 여러 개의 수업을 들을 수 있습니다. 이처럼 STUDENT 개체와 CLASS 개체 사이에는 다대다 관계가 형성됩니다.
다대다 관계가 복잡한 이유
다대다 관계는 관리하기가 상당히 까다롭습니다. 하나의 테이블 안에 특정 학생이 듣는 모든 수업 목록이나, 하나의 수업에 속한 모든 학생 목록을 나열하는 방식은 데이터가 심각하게 중복되고 구조가 지나치게 복잡해져 이해하기도, 유지보수하기도 어렵습니다.
이러한 문제를 해결하기 위해 조인 테이블(Junction Table)이라 불리는 중간 연결 테이블을 사용합니다. 아래 예시를 통해 그 구조를 살펴보겠습니다.
1. Student 테이블
Student 테이블은 학생 ID, 이름, 나이 등 개별 학생의 세부 정보를 저장합니다.
<Student>
| Student_ID | Student_Name | Student_Age |
| 1 | Amit | 27 |
| 2 | Tom | 23 |
| 3 | Jack | 32 |
2. Class 테이블
Class 테이블은 Class_ID, 수업 이름 등 서로 다른 수업들의 정보를 저장합니다.
<Class>
| Class_ID | Class_Name |
| 10 | English |
| 20 | Hindi |
| 30 | Mathematics |
3. StudentClass 테이블 (조인 테이블)
<StudentClass> 테이블은 <Student> 테이블과 <Class> 테이블을 연결하는 다리 역할을 합니다. 즉, 어떤 학생이 어떤 수업을 수강하는지에 대한 매핑 정보를 저장합니다.
<StudentClass>
| Student_ID | Class_ID |
| 1 | 10 |
| 1 | 20 |
| 2 | 10 |
| 2 | 30 |
| 3 | 10 |
조인 테이블 사용의 장점
위와 같은 조인 테이블을 활용하면 <Student>와 <Class> 간의 다대다 관계를 명확하고 깔끔하게 표현할 수 있습니다. 또한 두 테이블 간의 관계에 전혀 영향을 주지 않으면서 Student 테이블과 Class 테이블을 자유롭게 수정·확장할 수 있으며, 수강 정보가 변경될 때마다 <StudentClass> 테이블만 갱신하면 되므로 데이터 관리가 훨씬 유연해집니다.