소개
데이터베이스 정규화는 데이터의 중복을 최소화하고 일관성을 보장하기 위한 필수적인 과정입니다. 복잡해 보이는 정규화 과정을 실제 예제와 함께 쉽게 알아보겠습니다.
정규화의 필요성
데이터베이스 정규화가 왜 필요한지 알아보겠습니다:
- 데이터 중복 방지
- 삽입/수정/삭제 이상 현상 방지
- 데이터 일관성 유지
- 저장 공간 효율화
제1정규화 (1NF)
첫 번째 단계인 1NF의 핵심 규칙입니다.
정의
- 모든 속성은 원자값(Atomic Value)을 가져야 함
- 반복되는 그룹이 없어야 함
- 기본키를 설정해야 함
-- 정규화 전 (반복 그룹 포함)
CREATE TABLE student_courses (
student_id INT,
name VARCHAR(100),
courses VARCHAR(255) -- "수학,영어,과학"
);
-- 1NF 적용 후
CREATE TABLE student_courses (
student_id INT,
name VARCHAR(100),
course VARCHAR(100),
PRIMARY KEY (student_id, course)
);
1NF가 해결하는 문제
- 데이터 검색의 어려움
- 정렬과 필터링의 복잡성
- 데이터 무결성 검증의 어려움
제2정규화 (2NF)
부분적 함수 종속을 제거하는 2NF 과정입니다.
정의
- 1NF를 만족해야 함
- 부분적 함수 종속을 제거
- 모든 비주요 속성이 후보키 전체에 대해 완전 함수적으로 종속되어야
-- 2NF 적용 전 (부분 종속 존재)
CREATE TABLE order_details (
order_id INT,
product_id INT,
product_name VARCHAR(100), -- product_id에만 종속
quantity INT,
PRIMARY KEY (order_id, product_id)
);
-- 2NF 적용 후
CREATE TABLE orders (
order_id INT PRIMARY KEY,
quantity INT
);
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(100)
);
CREATE TABLE order_products (
order_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (order_id, product_id),
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
2NF가 해결하는 문제
- 데이터 중복
- 갱신 이상
- 삽입 이상
- 삭제 이상
제3정규화 (3NF)
이행적 종속성을 제거하는 3NF 과정입니다.
정의
- 2NF를 만족해야 함
- 이행적 함수 종속을 제거
- 비주요 속성은 후보키에 대해서만 직접 종속되어야
-- 3NF 적용 전 (이행 종속성 존재)
CREATE TABLE employee_details (
emp_id INT PRIMARY KEY,
department_id INT,
department_name VARCHAR(100), -- department_id에 종속
department_head VARCHAR(100) -- department_id에 종속
);
-- 3NF 적용 후
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
department_id INT,
FOREIGN KEY (department_id) REFERENCES departments(department_id)
);
CREATE TABLE departments (
department_id INT PRIMARY KEY,
department_name VARCHAR(100),
department_head VARCHAR(100)
);
3NF가 해결하는 문제
- 이행적 종속으로 인한 데이터 중복
- 업데이트 이상
- 데이터 불일치 가능성
BCNF(Boyce-Codd Normal Form)
정의
- 3NF를 만족해야 함
- 모든 결정자가 후보키여야 함
- 가장 엄격한 제3정규형
-- BCNF 적용 전
CREATE TABLE course_teachers (
student_id INT,
course_id INT,
teacher_id INT,
PRIMARY KEY (student_id, course_id),
UNIQUE (course_id, teacher_id)
);
-- BCNF 적용 후
CREATE TABLE course_assignments (
course_id INT PRIMARY KEY,
teacher_id INT,
UNIQUE (teacher_id)
);
CREATE TABLE student_courses (
student_id INT,
course_id INT,
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (course_id) REFERENCES course_assignments(course_id)
);
BCNF가 해결하는 문제
- 함수적 종속성의 모든 문제 해결
- 데이터 중복의 완전한 제거
- 갱신 이상의 완전한 제거
정규화의 장단점
장점
- 데이터 중복 최소화
- 데이터 무결성 보장
- 데이터 일관성 유지
- 유지보수 용이
단점
- 테이블 조인 증가
- 쿼리 복잡도 증가
- 성능 저하 가능성
정규화 vs 반정규화
때로는 성능 향상을 위해 의도적으로 정규화를 하지 않는 경우도 있습니다.
-- 정규화된 구조
SELECT o.order_id, c.customer_name, p.product_name, oi.price
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
JOIN order_items oi ON o.order_id = oi.order_id
JOIN products p ON oi.product_id = p.product_id;
-- 반정규화된 구조
SELECT order_id, customer_name, product_name, price
FROM denormalized_orders;
실무에서의 정규화 적용
- 요구사항 분석
- 데이터 모델링
- 정규화 수준 결정
- 성능 테스트
- 필요시 반정규화 검토
결론
데이터베이스 정규화는 데이터의 일관성과 무결성을 보장하는 중요한 과정입니다. 하지만 무조건적인 정규화보다는 비즈니스 요구사항과 성능을 고려하여 적절한 수준의 정규화를 적용하는 것이 중요합니다. 정규화의 기본 원칙을 이해하고 실무에 맞게 응용하는 것이 데이터베이스 설계의 핵심입니다.
'SQL' 카테고리의 다른 글
[SQL 실전 팁] REPLACE로 안전하게 데이터 일괄 수정하기 (0) | 2024.11.16 |
---|---|
SQL 기본 문법 (0) | 2024.11.12 |
SQL : 외래 키 제약 조건(FOREIGN KEY) (2) | 2024.11.08 |
SQL의 DISTINCT 문: 중복 제거와 고유 값 추출 (0) | 2024.10.25 |