1. 관계 차수란?
관계 차수(Relation Degree)는 관계형 데이터베이스에서 두 테이블 간의 관계 복잡성을 나타내는 개념입니다. 관계는 테이블 간의 데이터 연결 방식을 정의하며, 주로 1:1 (일대일), 1:N (일대다), N:M (다대다)로 나뉩니다.
| 관계 유형 | 설명 | 실생활 예시 |
| 1:1 (일대일) |
한 사람은 하나의 여권만 가질 수 있어요. 여권도 오직 한 사람만의 것이죠. | 사람 ↔ 여권 |
| 1:N (일대다) |
한 고객은 여러 주문을 할 수 있어요. 하지만 한 주문은 한 고객의 것이죠. | 고객 ↔ 주문 |
| N:M (다대다) |
여러 학생이 여러 과목을 수강하고, 한 과목도 여러 학생이 수강할 수 있어요. | 학생 ↔ 수업 |
혼동 주의(용어 정리)
- 테이블 차수: 테이블 내의 컬럼 수 (예: tb_user의 컬럼 수 = 3)
- 관계 차수: 두 테이블 간의 관계 유형 (예: 1:1, 1:N, N:M)
2. 1:1 (일대일) 관계 예시
사람(Person) 테이블과 여권(Passport) 테이블이 있다고 가정합니다
- 1:1 관계는 한 테이블의 레코드가 다른 테이블의 단 하나의 레코드와 연결되는 관계로, 특정 테이블 속성을 분리하거나 선택적 데이터를 별도로 관리할 때 사용됩니다.
Person 테이블
| person_id | name |
| 1 | 홍길동 |
| 2 | 김영희 |
| 3 | 이철수 |
Passport 테이블
| passport_id | passport_number | person_id |
| 101 | P12345678 | 1 |
| 102 | P87654321 | 2 |
| 103 | P11112222 | 3 |
use school;
-- 관계 차수에 대한 개념을 알아보자.
-- 사람과 여관에 관계 차수는 1:1 관계이다.
create table tb_person(
person_id int auto_increment ,
name varchar(50) not null,
primary key(person_id)
);
create table tb_passport(
passport_id int auto_increment,
passport_number varchar(20) not null,
person_id int unique,
primary key(passport_id),
foreign key(person_id) references tb_person(person_id)
);
insert into tb_person(name) values('홍길동'), ('김영희'), ('이철수');
insert into tb_passport(passport_number, person_id)
values('p1234', 1), ('p2222', 2), ('p3333', 3);
select * from tb_passport;
3. 1:N (일대다) 관계 예시
고객(Customer) 테이블과 주문(Order) 테이블이 있다고 가정합니다.
Customer 테이블
| customer_id | name |
| 1 | 박민지 |
| 2 | 최재영 |
Order 테이블
| order_id | product_name | customer_id |
| 201 | 노트북 | 1 |
| 202 | 마우스 | 1 |
| 203 | 키보드 | 2 |
-- 1 : N 관계 예시
create table tb_customer(
customer_id int auto_increment,
name varchar(50) not null,
primary key(customer_id)
);
create table tb_order(
order_id int auto_increment,
product_name varchar(50) not null,
customer_id int,
primary key(order_id),
foreign key(customer_id) references tb_customer(customer_id)
);

4. N:M (다대다) 관계 예시
학생(student) 테이블과 수업(course)이 있다고 가정 합시다.
- N:N (다대다) 관계는 한 테이블의 레코드가 다른 테이블의 여러 레코드와 연결되고, 반대로도 여러 레코드가 연결되는 관계입니다.
핵심 개념
- 한 명의 학생은 여러 개의 수업을 수강할 수 있다.
- 하나의 수업도 여러 명의 학생이 수강할 수 있다.
- 이럴 땐 중간 테이블(보통 수강(student_course) 같은 이름)이 필요해요
N:M 관계를 테이블 2개로만 표현하는 것은 불가능합니다. 하지만 억지로 만들어 봅시다.
학생 테이블
|
student_id
|
name
|
|
1
|
홍길동
|
|
2
|
김영희
|
|
3
|
박민지
|
수강 테이블
|
course_id
|
title
|
students
|
|
101
|
자바
|
홍길동, 박민지
|
|
102
|
DB
|
홍길동, 김영희
|
|
103
|
웹개발
|
김영희
|
정리
관계형 데이터베이스에서는 N:M 관계를 직접 2개 테이블로 표현할 수 없습니다.
이를 해결하기 위해 중간 테이블(교차 테이블)을 사용해야 합니다.
중간 테이블은 두 테이블의 기본 키를 외래 키로 포함하며, 두 테이블 간의 관계를 매핑합니다.
student 테이블
|
student_id
|
name
|
|
1
|
홍길동
|
|
2
|
김영희
|
|
3
|
박민지
|
수강 테이블
|
course_id
|
title
|
students
|
|
101
|
자바
|
홍길동, 박민지
|
|
102
|
DB
|
홍길동, 김영희
|
|
103
|
웹개발
|
김영희
|
수강(student_course) 테이블 (중간 테이블)
|
student_id
|
course_id
|
|
1
|
101
|
|
1
|
102
|
|
2
|
102
|
|
2
|
103
|
|
3
|
101
|
중간 테이블 이름 짓기 권장사항
두 테이블 이름을 조합해 만든다 (가장 일반적)
예: student_course, user_role, author_book
- 어떤 두 테이블의 관계인지 명확하게 드러남
- 테이블을 보지 않고도 연결 목적이 보임
업무 용어에 따라 의미 있는 이름을 줄 수도 있다 (선택적)
- enrollment (student + course 관계 = 수강)
- subscription (user + newsletter 관계 = 구독)
- assignment (employee + task 관계 = 할당)
테이블 직접 만들어 보기
CREATE TABLE tb_student (
student_id INT AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
PRIMARY KEY (student_id)
);
CREATE TABLE tb_course (
course_id INT AUTO_INCREMENT,
title VARCHAR(50) NOT NULL,
PRIMARY KEY (course_id)
);
CREATE TABLE tb_student_course (
student_id INT,
course_id INT,
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES tb_student(student_id),
FOREIGN KEY (course_id) REFERENCES tb_course(course_id)
);
-- tb_student 데이터 삽입
INSERT INTO tb_student (name) VALUES
('홍길동'),
('김영희');
-- tb_course 데이터 삽입
INSERT INTO tb_course (course_id, title) VALUES
(101, '자바'),
(102, '데이터베이스');
-- tb_student_course 데이터 삽입
INSERT INTO tb_student_course (student_id, course_id) VALUES
(1, 101), -- 홍길동: 자바
(1, 102), -- 홍길동: 데이터베이스
(2, 102); -- 김영희: 데이터베이스
- N:M 관계 설계:
- 중간 테이블의 기본 키는 두 외래 키의 조합으로 설정.
- FOREIGN KEY 제약 조건으로 데이터 무결성 보장.
5. 관계 차수 개념 정리
관계 차수는 관계형 데이터베이스에서 두 테이블 간의 관계를 나타냅니다
- 1:1 (일대일): 한 레코드가 다른 테이블의 한 레코드와 매칭 (예: 사람과 여권)
- 1:N (일대다): 한 레코드가 다른 테이블의 여러 레코드와 매칭 (예: 고객과 주문)
- N:1 (다대일): 여러 레코드가 한 테이블의 한 레코드와 매칭 (1:N의 반대 관점)
- N:M (다대다): 여러 레코드가 서로 여러 레코드와 매칭, 중간 테이블 필요 (예: 학생과 수업)
'MySQL' 카테고리의 다른 글
| blog 구성해보기 (0) | 2025.05.13 |
|---|---|
| ERD 다이어 그램 만들어 보기 (2) | 2025.05.13 |
| PRIMARY KEY, FOREIGN KEY, UNIQUE KEY 란 뭘까? (0) | 2025.05.12 |
| DELETE 연습 예제 (0) | 2025.05.09 |
| DELETE 구문과 조건절 (0) | 2025.05.09 |