데이터베이스 정규화 (Database Normalization)
데이터베이스 정규화는 관계형 데이터베이스의 설계를 체계화하고 최적화하는 과정.
정규화의 정의와 목적
정규화는 데이터의 중복을 최소화하고, 데이터의 무결성을 보장하며, 데이터베이스 구조를 더 유연하게 만드는 것을 목표로 한다.
주요 목적은:
- 데이터 중복 최소화
- 데이터 무결성 향상
- 데이터베이스 구조의 유연성 증대
- 데이터 일관성 유지
- 데이터 갱신 이상 현상 방지
정규화 단계
정규화는 여러 단계로 이루어지며, 각 단계를 정규형(Normal Form)이라고 한다:
제1정규형(1NF): 각 컬럼이 원자값을 가지도록 한다. 즉, 하나의 컬럼에 여러 값이 들어있으면 안 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
-- 잘못된 예시 CREATE TABLE contacts ( id INT, name VARCHAR(100), phone_numbers VARCHAR(200) -- "010-1234-5678, 02-123-4567" ); -- 1NF를 만족하는 설계 CREATE TABLE contacts ( id INT, name VARCHAR(100) ); CREATE TABLE contact_phones ( contact_id INT, phone_number VARCHAR(20) );
제2정규형(2NF): 부분 함수적 종속을 제거한다. 모든 비주요 속성은 기본키 전체에 종속되어야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
-- 2NF 적용 전 CREATE TABLE order_items ( order_id INT, product_id INT, product_name VARCHAR(100), -- product_id에만 종속 quantity INT, price DECIMAL(10,2) ); -- 2NF 적용 후 CREATE TABLE products ( product_id INT PRIMARY KEY, product_name VARCHAR(100) ); CREATE TABLE order_items ( order_id INT, product_id INT, quantity INT, price DECIMAL(10,2), FOREIGN KEY (product_id) REFERENCES products(product_id) );
제3정규형(3NF): 이행적 함수 종속을 제거한다. 비주요 속성들 간의 종속성을 제거한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
-- 3NF 적용 전 CREATE TABLE employees ( employee_id INT PRIMARY KEY, department_id INT, department_name VARCHAR(100), department_location VARCHAR(200) ); -- 3NF 적용 후 CREATE TABLE departments ( department_id INT PRIMARY KEY, department_name VARCHAR(100), department_location VARCHAR(200) ); CREATE TABLE employees ( employee_id INT PRIMARY KEY, department_id INT, FOREIGN KEY (department_id) REFERENCES departments(department_id) );
보이스-코드 정규형(BCNF): 모든 결정자가 후보 키가 되도록 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
-- BCNF 적용 전 CREATE TABLE course_instructors ( student_id INT, course_id INT, instructor_id INT, grade VARCHAR(2), PRIMARY KEY (student_id, course_id) ); -- BCNF 적용 후 CREATE TABLE course_assignments ( course_id INT PRIMARY KEY, instructor_id INT ); CREATE TABLE student_courses ( student_id INT, course_id INT, grade VARCHAR(2), PRIMARY KEY (student_id, course_id), FOREIGN KEY (course_id) REFERENCES course_assignments(course_id) );
제4정규형(4NF): 다중값 종속성을 제거한다.
제5정규형(5NF): 조인 종속성을 제거한다.
정규화의 장점
- 데이터 중복 감소로 저장 공간 절약
- 데이터 일관성과 무결성 보장
- 데이터베이스 구조 개선으로 유지보수 용이성 증가
- 데이터 검색과 수정의 효율성 향상
정규화의 단점
- 테이블 간 조인 연산 증가로 인한 성능 저하 가능성
- 데이터베이스 설계의 복잡성 증가
- 특정 데이터 검색 시 여러 테이블을 거쳐야 하는 경우 발생