관계의 표현 방식
관계 표현법:
- 1:1 (일대일) - 하나의 A는 하나의 B로 구성
- 1:N (일대다) - 하나의 A는 하나 이상의 B로 구성
- 1:0..1 (일대영또는일) - 하나의 A는 하나 이하의 B로 구성
- 1:0..* (일대영이상) - 하나의 A는 0 또는 하나 이상의 B로 구성
1. 일대일 관계 (1:1)
하나의 A는 하나의 B로 구성되어 있다
-- 예시: 사용자와 사용자 프로필
CREATE TABLE users (
user_id INT PRIMARY KEY,
username VARCHAR(50) UNIQUE,
email VARCHAR(100)
);
CREATE TABLE user_profiles (
profile_id INT PRIMARY KEY,
user_id INT UNIQUE, -- 1:1 관계를 위한 유니크 제약
bio TEXT,
avatar_url VARCHAR(255),
FOREIGN KEY (user_id) REFERENCES users(user_id)
);
-- 각 사용자는 정확히 하나의 프로필을 가짐
2. 일대다 관계 (1:N)
하나의 A는 하나 이상의 B로 구성되어 있다
-- 예시: 부서와 직원
CREATE TABLE departments (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(50)
);
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
emp_name VARCHAR(50),
dept_id INT NOT NULL, -- 필수 (하나 이상)
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);
-- 각 부서는 최소 1명 이상의 직원을 가져야 함
3. 일대영또는일 관계 (1:0..1)
하나의 A는 하나 이하의 B로 구성되어 있다
-- 예시: 직원과 주차공간
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
emp_name VARCHAR(50)
);
CREATE TABLE parking_spaces (
space_id INT PRIMARY KEY,
emp_id INT UNIQUE NULL, -- NULL 허용 (0 또는 1)
space_number VARCHAR(10),
FOREIGN KEY (emp_id) REFERENCES employees(emp_id)
);
-- 각 직원은 주차공간이 없거나 최대 1개만 가질 수 있음
4. 일대영이상 관계 (1:0..*)
하나의 A는 0 또는 하나 이상의 B로 구성되어 있다
-- 예시: 고객과 주문
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
customer_name VARCHAR(50)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT NULL, -- NULL 허용 (0개 가능)
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
-- 각 고객은 주문이 없을 수도 있고, 여러 개를 가질 수도 있음
키(Key)의 계층 구조
키의 관계도
슈퍼키 (Superkey)
│
├─ 후보키 (Candidate Key) ── 유일성 + 최소성
│ │
│ ├─ 기본키 (Primary Key) ── 선택된 후보키
│ └─ 대체키 (Alternate Key) ── 선택되지 않은 후보키
│
└─ 비후보키 ── 최소성 위반
유일성과 최소성
- 유일성: 중복되는 값이 없음
- 최소성: 필드를 조합하지 않고 최소 필드만 써서 키를 형성할 수 있는 것
슈퍼키 (Super Key)
유일성이 있고, 그 안에 포함된 후보키는 최소성까지 갖춘 키입니다.
-- 학생 테이블 예시
CREATE TABLE students (
student_id INT, -- 고유 번호
ssn VARCHAR(13), -- 주민등록번호
email VARCHAR(100), -- 이메일
name VARCHAR(50), -- 이름
phone VARCHAR(15) -- 전화번호
);
-- 슈퍼키 예시들:
-- {student_id} ← 후보키 (최소성 O)
-- {ssn} ← 후보키 (최소성 O)
-- {email} ← 후보키 (최소성 O)
-- {student_id, name} ← 슈퍼키 (최소성 X)
-- {ssn, email} ← 슈퍼키 (최소성 X)
-- {student_id, ssn, email} ← 슈퍼키 (최소성 X)
기본키 (Primary Key)
유일성과 최소성을 만족하는 키이며, 테이블의 각 행을 고유하게 식별하는 필드입니다.
기본키의 규칙
- 각 테이블에는 하나의 기본키만 있을 수 있음
- NULL 값을 가질 수 없음
- 중복 값을 가질 수 없음
- 필드의 조합일 수도 있음
-- 단일 필드 기본키
CREATE TABLE users (
user_id INT PRIMARY KEY, -- 기본키
username VARCHAR(50),
email VARCHAR(100)
);
-- 복합 기본키
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (order_id, product_id) -- 복합 기본키
);
자연키 (Natural Key)
이미 데이터에 존재하고, 실제로 의미가 있는 필드를 사용하여 테이블의 행을 고유하게 식별하는 키
-- 자연키 예시
CREATE TABLE countries (
country_code CHAR(2) PRIMARY KEY, -- ISO 국가코드 (자연키)
country_name VARCHAR(50),
continent VARCHAR(20)
);
INSERT INTO countries VALUES
('KR', '대한민국', 'Asia'),
('US', '미국', 'North America'),
('JP', '일본', 'Asia');
-- 장점: 의미가 있고 직관적
-- 단점: 변경 가능성, 복잡한 조인
인조키 (Surrogate Key)
테이블의 행을 식별하기 위해 특별히 생성된, 일반적으로 숫자로 이루어진 고유 식별 키
-- 인조키 예시
CREATE TABLE customers (
customer_id INT AUTO_INCREMENT PRIMARY KEY, -- 인조키
customer_name VARCHAR(50),
email VARCHAR(100),
ssn VARCHAR(13) -- 자연키가 될 수 있지만 기본키로 사용 안 함
);
-- 장점: 변경되지 않음, 성능 우수, 단순한 조인
-- 단점: 실질적 의미 없음, 추가 저장공간 필요
자연키 vs 인조키
| 특성 | 자연키 | 인조키 |
| 의미 | 실제 의미 있음 | 의미 없음 |
| 변경 가능성 | 변경 가능 | 변경 불가 |
| 성능 | 복잡할 수 있음 | 우수 |
| 저장공간 | 다양 | 효율적 |
| 조인 성능 | 느릴 수 있음 | 빠름 |
외래키 (Foreign Key)
다른 테이블의 기본키를 참조하는 필드입니다.
외래키의 규칙
- 참조하는 기본키의 값과 일치해야 함
- 중복될 수 있음 (여러 행이 같은 값 참조 가능)
- NULL 값을 가질 수 있음 (선택적 관계)
-- 외래키 예시
CREATE TABLE departments (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(50)
);
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
emp_name VARCHAR(50),
dept_id INT, -- 외래키
manager_id INT, -- 자기 참조 외래키
FOREIGN KEY (dept_id) REFERENCES departments(dept_id),
FOREIGN KEY (manager_id) REFERENCES employees(emp_id)
);
-- 외래키 제약 조건
-- 1. 참조 무결성: dept_id는 departments.dept_id에 존재하는 값이어야 함
-- 2. NULL 허용: dept_id가 NULL이면 부서 미배정 의미
-- 3. 중복 허용: 여러 직원이 같은 부서 소속 가능
후보키 (Candidate Key)
기본키가 될 수 있는 후보들이며 유일성과 최소성을 만족하는 것
대체키 (Alternate Key)
기본키로 선택되지 않은 후보키
-- 후보키와 대체키 예시
CREATE TABLE students (
student_id INT PRIMARY KEY, -- 기본키 (선택된 후보키)
ssn VARCHAR(13) UNIQUE NOT NULL, -- 대체키 (후보키였지만 선택 안됨)
email VARCHAR(100) UNIQUE NOT NULL, -- 대체키 (후보키였지만 선택 안됨)
student_number VARCHAR(10) UNIQUE NOT NULL, -- 대체키
name VARCHAR(50),
age INT
);
-- 후보키 목록:
-- 1. {student_id} ← 기본키로 선택됨
-- 2. {ssn} ← 대체키
-- 3. {email} ← 대체키
-- 4. {student_number} ← 대체키
복합키 (Composite Key)
두 개 이상의 필드를 조합하여 만든 키입니다. 각 필드 단독으로는 행을 고유하게 식별하지 못하지만, 조합할 경우 식별이 가능합니다.
-- 복합키 예시 1: 주문 상품 테이블
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
unit_price DECIMAL(10,2),
PRIMARY KEY (order_id, product_id), -- 복합 기본키
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
-- 의미: 같은 주문에서 같은 상품은 하나의 레코드만 존재
-- order_id=1, product_id=5 조합이 유일함
-- 복합키 예시 2: 학생 과목 수강 테이블
CREATE TABLE enrollments (
student_id INT,
course_id INT,
semester VARCHAR(10),
grade CHAR(2),
PRIMARY KEY (student_id, course_id, semester), -- 3개 필드 복합키
FOREIGN KEY (student_id) REFERENCES students(student_id),
FOREIGN KEY (course_id) REFERENCES courses(course_id)
);
-- 의미: 특정 학생이 특정 학기에 특정 과목을 중복 수강할 수 없음
'ZeroBase > CS' 카테고리의 다른 글
| 데이터베이스 Join (0) | 2025.09.24 |
|---|---|
| ERD(Entity Relation Diagram) (3) | 2025.09.21 |
| ENUM과 SET (0) | 2025.09.16 |
| 힙(Heap) (0) | 2025.09.15 |
| 해시테이블(HashTable) (0) | 2025.09.13 |