Relationship 유형 Cardinality
1:1 (One-to-One)
- 의미: 한쪽 레코드가 다른 쪽 레코드와 딱 하나만 연결됨.
- 예시: 사람 ↔ 주민등록증
- SQL 구현: UNIQUE 제약조건이나 PRIMARY KEY와 FOREIGN KEY를 함께 사용.
CREATE TABLE Person (
person_id INT PRIMARY KEY,
name VARCHAR(50)
);
CREATE TABLE IDCard (
card_id INT PRIMARY KEY,
person_id INT UNIQUE,
FOREIGN KEY (person_id) REFERENCES Person(person_id)
);
1:N (One-to-Many)
- 의미: 한쪽 레코드가 다른 쪽의 여러 개와 연결됨.
- 예시: 고객 ↔ 주문
- SQL 구현: N 쪽에 FOREIGN KEY를 둠.
CREATE TABLE Customer (
customer_id INT PRIMARY KEY,
name VARCHAR(50)
);
CREATE TABLE Orders (
order_id INT PRIMARY KEY,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES Customer(customer_id)
);
N:1 (Many-to-One)
- 의미: 사실상 1:N의 반대 관점.
- 예시: 주문 ↔ 고객
- 여러 주문이 하나의 고객에 속함.
- 즉, 주문 입장에서 보면 "Many-to-One" 관계.
- SQL 구현: 동일하게 FOREIGN KEY 사용 (관점을 어디에 두느냐 차이).
N:N (Many-to-Many)
- 의미: 양쪽 레코드 모두 서로 여러 개와 연결 가능.
- 예시: 학생 ↔ 강좌
- SQL 구현: 중간 테이블(조인 테이블) 필요
CREATE TABLE Student (
student_id INT PRIMARY KEY,
name VARCHAR(50)
);
CREATE TABLE Course (
course_id INT PRIMARY KEY,
title VARCHAR(50)
);
CREATE TABLE StudentCourse (
student_id INT,
course_id INT,
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES Student(student_id),
FOREIGN KEY (course_id) REFERENCES Course(course_id)
);
INSERT INTO Student (student_id, name) VALUES
(1, '철수'),
(2, '영희'),
(3, '민수');
INSERT INTO Course (course_id, title) VALUES
(101, '데이터베이스'),
(102, '파이썬'),
(103, '알고리즘');
INSERT INTO StudentCourse (student_id, course_id) VALUES
(1, 101),
(1, 102);
INSERT INTO StudentCourse (student_id, course_id) VALUES
(2, 102),
(2, 103);
INSERT INTO StudentCourse (student_id, course_id) VALUES
(3, 101);
SELECT * FROM Student;
SELECT * FROM Course;
SELECT * FROM StudentCourse;;
| course_id | title |
|---|
| 101 | 데이터베이스 |
| 102 | 파이썬 |
| 103 | 알고리즘 |
| student_id | course_id |
|---|
| 1 | 101 |
| 1 | 102 |
| 2 | 102 |
| 2 | 103 |
| 3 | 101 |
총정리
- 1:1 → UNIQUE + FOREIGN KEY
- 1:N / N:1 → N 쪽에 FOREIGN KEY
- M:N → 중간 테이블로 분리
ERD