데이터베이스에서 관계(Relationship)는 서로 다른 테이블 간의 연관성을 정의합니다. 관계형 데이터베이스에서는 주로 키(key)를 이용해 이러한 관계를 설정하며, 관계는 다음과 같은 주요 유형으로 분류됩니다.
1. 일대일 관계 (One-to-One, 1:1)
- 한 테이블의 레코드가 다른 테이블의 정확히 하나의 레코드와만 연관됨.
- 예: 주민등록번호와 주민 개인 정보
- 주민 테이블의 각 주민은 하나의 주민등록정보만 가짐.
- 구현 방식: 두 테이블 중 하나가 다른 테이블의 기본 키를 외래 키로 사용.
-- 주민 테이블
CREATE TABLE Residents (
resident_id SERIAL PRIMARY KEY,
name VARCHAR(100)
);
-- 주민등록 정보 테이블 (1:1 관계)
CREATE TABLE ResidentIDs (
id SERIAL PRIMARY KEY,
resident_id INT UNIQUE, -- UNIQUE로 1:1 보장
ssn CHAR(13) NOT NULL,
FOREIGN KEY (resident_id) REFERENCES Residents(resident_id)
);
- ResidentIDs 테이블은 Residents 테이블과 1:1 관계.
- 각 주민은 오직 하나의 주민등록번호를 가지며, resident_id에 UNIQUE 제약조건이 걸려 있어 1:1이 유지됩니다.
2. 일대다 관계 (One-to-Many, 1:N)
- 한 테이블의 레코드는 다른 테이블의 여러 레코드와 연관될 수 있음.
- 예: 고객과 주문한 고객은 여러 주문을 할 수 있지만, 하나의 주문은 하나의 고객에게만 속함.
- 구현 방식: "다" 측 테이블이 "일" 측 테이블의 기본 키를 외래 키로 참조함.
-- 고객 테이블
CREATE TABLE Customers (
customer_id SERIAL PRIMARY KEY,
name VARCHAR(100)
);
-- 주문 테이블 (1:N 관계)
CREATE TABLE Orders (
order_id SERIAL PRIMARY KEY,
customer_id INT,
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES Customers(customer_id)
);
- 하나의 고객(Customers)은 여러 주문(Orders)을 할 수 있습니다.
- 하지만 각 주문은 한 고객에게만 속함 → 1:N 관계.
3. 다대다 관계 (Many-to-Many, M:N)
- 한 테이블의 여러 레코드가 다른 테이블의 여러 레코드와 연관될 수 있음.
- 예: 학생과 과목
- 한 학생이 여러 과목을 수강할 수 있고, 한 과목은 여러 학생이 수강 가능.
- 구현 방식: **중간 테이블(Junction Table)**을 사용하여 두 테이블의 외래 키를 조합.
-- 학생 테이블
CREATE TABLE Students (
student_id SERIAL PRIMARY KEY,
name VARCHAR(100)
);
-- 과목 테이블
CREATE TABLE Subjects (
subject_id SERIAL PRIMARY KEY,
title VARCHAR(100)
);
-- 중간 테이블 (수강 정보) - M:N 관계
CREATE TABLE Enrollments (
student_id INT,
subject_id INT,
PRIMARY KEY (student_id, subject_id),
FOREIGN KEY (student_id) REFERENCES Students(student_id),
FOREIGN KEY (subject_id) REFERENCES Subjects(subject_id)
);
- Enrollments는 중간 테이블로 다대다(M:N) 관계를 표현.
- 여러 학생이 여러 과목을 수강할 수 있고, 반대로도 가능.
4. 자가 관계 (Self-Referencing Relationship)
- 테이블이 자기 자신과 관계를 맺는 경우.
- 예: 사원 테이블에서 각 사원이 상사를 가질 수 있음 (상사도 같은 테이블의 사원임).
- 구현 방식: 테이블 내의 한 필드가 같은 테이블의 기본 키를 외래 키로 참조.
-- 사원 테이블
CREATE TABLE Employees (
employee_id SERIAL PRIMARY KEY,
name VARCHAR(100),
manager_id INT,
FOREIGN KEY (manager_id) REFERENCES Employees(employee_id)
);
- manager_id 필드가 같은 테이블의 employee_id를 참조 → 자기 자신과 관계.
- 상사가 없는 경우(CEO 등)는 manager_id가 NULL.
'SQL' 카테고리의 다른 글
| SQL 명령문의 실행순서 (2) | 2025.05.12 |
|---|---|
| RDBMS (1) | 2025.05.09 |
| JOIN이란? 그리고 'INNER JOIN'과 'LEFT JOIN'의 차이점 (2) | 2025.05.07 |
| 정규화에 대하여 (4) | 2025.05.01 |
| 기본 키(primary key)와 외래 키(foreign key) (0) | 2025.05.01 |