다대다 관계를 연결 테이블로 설계하기
학생 한 명이 여러 강의를 듣고 강의 하나에도 여러 학생이 등록한다면 다대다 관계입니다. students에 강의 ID 목록을 넣는 대신 enrollments에 학생·강의 한 쌍씩 기록합니다. 세 테이블과 두 외래키로 관계를 표현하고 중복 등록을 막는 기준을 살펴보겠습니다.
K는 기본키, *는 필수 컬럼입니다. 작은 화면에서는 그림을 좌우로 스크롤하거나 눌러서 크게 볼 수 있습니다.
바로 가져올 수 있는 DBML 예제
한 학생은 같은 강의에 한 번만 등록할 수 있다고 가정합니다. (student_id, course_id) 복합 기본키가 그 규칙을 표현합니다. enrolled_at은 학생이나 강의 자체가 아닌 수강 관계에 속하는 값입니다.
Table students {
id bigint [pk]
name varchar(100) [not null]
}
Table courses {
id bigint [pk]
title varchar(160) [not null]
}
Table enrollments {
student_id bigint [not null]
course_id bigint [not null]
enrolled_at timestamp [not null]
indexes {
(student_id, course_id) [pk]
}
}
Ref: enrollments.student_id > students.id
Ref: enrollments.course_id > courses.id아래 버튼은 이 코드에서 만든 예제를 새 문서로 엽니다. 가입 없이 편집할 수 있으며 기존 작업은 보관됩니다. 직접 가져오려면 코드를 복사해 편집기의 가져오기에 붙여넣으세요.
이 예제로 시작하기 →다대다를 두 개의 일대다로 바꾸기
enrollments의 한 행은 한 학생과 한 강의를 가리킵니다. 같은 학생 ID는 다른 강의 ID와 여러 번 나타날 수 있고, 같은 강의 ID도 여러 학생 ID와 나타날 수 있습니다. 따라서 students → enrollments와 courses → enrollments는 각각 일대다입니다. 외래키 컬럼 이름만 적는 것으로 끝내지 않고 두 FK를 선언해야 합니다.
복합 기본키와 각각의 UNIQUE는 다릅니다
(student_id, course_id) 복합 PK는 조합의 중복을 막습니다. 학생 1–강의 10과 학생 1–강의 20은 함께 존재할 수 있지만 학생 1–강의 10을 또 넣을 수는 없습니다. student_id 하나에 UNIQUE를 걸면 한 학생이 한 강의만 들을 수 있게 되어 의도와 달라집니다.
별도 id가 필요하다면
다른 테이블이 수강 한 건을 자주 참조한다면 enrollments.id를 PK로 두는 방식도 가능합니다. 그래도 중복 수강을 막으려면 student_id와 course_id에 NOT NULL을 유지하고 UNIQUE(student_id, course_id)를 추가해야 합니다. 새 id만 추가해서는 업무상 중복이 사라지지 않습니다.
재수강을 허용한다면 키부터 다시 검토
현재 예제는 같은 강의의 재수강을 허용하지 않습니다. 학기별 재수강이 필요하면 개설 강의인 course_offerings를 두고 강의·학기를 연결한 뒤 (student_id, offering_id)를 고유하게 만드는 방법이 있습니다. 같은 개설 강의 안에서도 여러 시도를 기록해야 한다면 시도 이력 테이블을 따로 검토하세요.
어디에 속하는 값인지 묻기
학생 이름은 students, 강의 제목은 courses, 등록 시각·성적·수강 상태는 enrollments에 속합니다. 강의 ID를 쉼표로 연결한 문자열이나 여러 course_1 컬럼에 넣으면 개별 관계에 외래키를 적용하고 속성을 붙이기 어려워집니다. 연결 테이블은 관계 자체의 정보를 저장할 자리를 마련합니다.
직접 해보기: 수강 상태 추가
예제를 열고 enrollments에 status varchar(20) 컬럼을 추가하세요. 구조 패널에서 student_id와 course_id가 함께 PK인지 확인하고, 두 외래키가 각각 올바른 테이블을 가리키는지 살펴보세요. 상태값 목록과 전이 규칙은 실제 서비스에서 별도로 정해야 합니다. 변경한 예제를 JSON으로 백업하세요.
예제 열고 실습하기 →지금 무료로 사용할 수 있는 기능
현재 Free에서 DBML·Schema Studio JSON 가져오기와 내보내기, 테이블·관계 편집을 제공합니다. 로그인 후 클라우드에 저장할 수 있으며 중요한 작업은 JSON으로 백업하세요. 지원 범위의 PostgreSQL·MySQL DDL 가져오기, PostgreSQL 수집 쿼리와 PNG 출력도 무료입니다. SQL·SVG 출력은 준비 중입니다. MySQL 입력은 PostgreSQL 문서 모델로 변환되며 원본과 경고를 확인하세요.
요금제와 저장 한도 확인 →