학생 테이블(Students): 학생 정보를 담고 있음
강의 테이블(Courses): 강의 정보를 담고 있음
수강 테이블(Enrollments): 학생과 강의 간의 관계를 저장하는 중간 테이블
이때 수강 테이블이 중간 테이블이 되어, 학생과 강의의 관계를 연결합니다. 수강 테이블은 각 학생이 어떤 강의를 수강하고 있는지에 대한 정보를 저장하며, 이를 통해 다대다 관계를 처리합니다.
학생 테이블(Students):
| student_id | student_name |
|---|---|
| 1 | 김철수 |
| 2 | 이영희 |
강의 테이블(Courses):
| course_id | course_name |
|---|---|
| 101 | 수학 |
| 102 | 영어 |
수강 테이블(Enrollments):
| student_id | course_id |
| --- | --- |
| 1 | 101 |
| 1 | 102 |
| 2 | 101 |
이처럼, 중간 테이블은 두 테이블 간의 관계를 명확히 정의하고, 필요한 데이터에 대한 접근을 용이하게 만듭니다.
중간 테이블을 사용하면 데이터베이스를 정규화할 수 있습니다. 정규화는 데이터를 중복 없이 효율적으로 저장하기 위한 프로세스로, 데이터를 여러 개의 작은 테이블로 분할하는 방법입니다. 이를 통해 데이터 중복을 최소화하고, 저장 공간을 절약할 수 있습니다.
예를 들어, 위에서 설명한 학생-강의 관계에서 중간 테이블이 없다면, 학생 테이블에 강의 정보가 중복될 수 있습니다. 여러 명의 학생이 같은 강의를 수강할 때, 그 강의 정보를 각 학생 레코드마다 반복해서 저장해야 할 것입니다. 이는 불필요한 데이터 중복을 초래하고, 관리가 어려워집니다.
중간 테이블을 사용하면, 두 테이블 간의 관계에 추가적인 정보를 저장할 수 있는 장점이 있습니다. 예를 들어, 학생이 강의를 수강한 날짜나 수강 상태(수료/미수료) 등의 정보를 추가로 저장하고 싶다면, 중간 테이블에 해당 필드를 추가할 수 있습니다.
수강 테이블(Enrollments):
| student_id | course_id | enrollment_date | status |
| --- | --- | --- | --- |
| 1 | 101 | 2024-03-01 | 수료 |
| 1 | 102 | 2024-03-01 | 미수료 |
| 2 | 101 | 2024-03-02 | 수료 |
이렇게 중간 테이블에 추가적인 속성을 두면, 관계를 더 정교하게 표현하고 관리할 수 있습니다.
중간 테이블은 복잡한 조인(Join)을 통해 여러 테이블을 연결하는 데 유용합니다. 예를 들어, 학생과 강의 테이블을 직접 조인하면 불필요한 중복 데이터를 가져올 수 있습니다. 그러나 중간 테이블을 사용하면, 필요한 데이터만 정확히 조인할 수 있어 성능이 최적화됩니다. 또한, 중간 테이블을 활용한 관계 설정은 쿼리의 가독성도 높여 줍니다.
학생이 수강한 강의를 조회하는 쿼리:
SELECT s.student_name, c.course_name
FROM Students s
JOIN Enrollments e ON s.student_id = e.student_id
JOIN Courses c ON e.course_id = c.course_id;
위 쿼리는 학생 테이블과 강의 테이블을 직접 조인하는 것이 아니라, 수강 테이블을 중간 테이블로 활용하여 효율적으로 데이터를 조회합니다.
중간 테이블을 사용하면 데이터 모델이 유연해집니다. 관계를 확장할 때, 테이블 구조를 크게 변경하지 않고도 중간 테이블에 새로운 속성이나 테이블을 추가하는 것만으로 쉽게 확장할 수 있습니다. 예를 들어, 학생과 강의 외에도, 학생-강의-교수 관계를 추가하고 싶다면, 기존 중간 테이블을 확장하여 교수 정보를 저장하는 컬럼을 추가할 수 있습니다.
중간 테이블은 다대다 관계를 효율적으로 처리하고, 정규화를 통해 데이터 중복을 방지하며, 추가적인 속성 저장이 가능하고, 쿼리 성능을 최적화하는 등 다양한 이유로 관계형 데이터베이스에서 중요한 역할을 합니다. 또한, 유연한 데이터 모델링을 가능하게 하여, 시스템 확장이 용이하도록 도와줍니다. 따라서 중간 테이블을 적절히 활용하는 것은 데이터베이스 설계의 핵심적인 부분입니다.