정규화
Normalization
데이터 중복 제거 및 무결성 향상. 1NF~5NF.
Normalization
데이터 중복 제거 및 무결성 향상. 1NF~5NF.
정규화(Normalization)는 데이터베이스 설계에서 중복을 최소화하고 데이터 무결성을 보장하기 위해 테이블을 분리하는 과정입니다. E.F. Codd가 1970년대에 제안한 관계형 데이터베이스 이론의 핵심 개념으로, 삽입/수정/삭제 이상(Anomaly)을 방지합니다.
제1정규형(1NF)은 각 컬럼이 원자값(atomic value)만 가져야 합니다. 제2정규형(2NF)은 부분 함수 종속을 제거하여 모든 비키 속성이 기본키 전체에 종속되어야 합니다. 제3정규형(3NF)은 이행 함수 종속을 제거하여 비키 속성이 다른 비키 속성에 종속되면 안 됩니다.
BCNF(Boyce-Codd Normal Form)는 3NF의 강화 버전으로, 모든 결정자가 후보키여야 합니다. 4NF와 5NF는 다치 종속과 조인 종속을 다루며, 실무에서는 보통 3NF나 BCNF까지만 적용합니다.
정규화는 데이터 무결성을 높이지만, 조인이 많아져 조회 성능이 저하될 수 있습니다. 읽기 성능이 중요한 경우 선택적으로 비정규화를 적용하여 균형을 맞춥니다.
-- 정규화 전: 모든 데이터가 한 테이블에 (중복 발생)
CREATE TABLE orders_denorm (
order_id INT,
customer_name VARCHAR(100),
customer_email VARCHAR(100),
customer_address VARCHAR(200), -- 고객 주소 중복
product_name VARCHAR(100),
product_price DECIMAL(10,2) -- 상품 가격 중복
);
-- 정규화 후: 테이블 분리
CREATE TABLE customers (
id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100),
address VARCHAR(200)
);
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100),
price DECIMAL(10,2)
);
CREATE TABLE orders (
id INT PRIMARY KEY,
customer_id INT REFERENCES customers(id),
order_date DATE
);
CREATE TABLE order_items (
id INT PRIMARY KEY,
order_id INT REFERENCES orders(id),
product_id INT REFERENCES products(id),
quantity INT
);
-- 조회 시 JOIN 사용
SELECT c.name, o.order_date, p.name, oi.quantity
FROM customers c
JOIN orders o ON c.id = o.customer_id
JOIN order_items oi ON o.id = oi.order_id
JOIN products p ON oi.product_id = p.id;
시니어: 이 테이블에 고객 정보가 주문마다 중복 저장되고 있어요. 정규화가 필요합니다.
주니어: 조인하면 쿼리가 복잡해지지 않나요?
시니어: 네, 하지만 고객 주소가 바뀌면 모든 주문을 수정해야 해요. 정규화하면 customers 테이블만 수정하면 됩니다.
면접관: 정규화의 장단점을 설명해주세요.
지원자: 장점은 데이터 중복 감소, 저장 공간 절약, 업데이트 이상 방지입니다. 단점은 조인 증가로 인한 조회 성능 저하와 쿼리 복잡도 증가입니다. 읽기가 많은 시스템에서는 선택적 비정규화로 균형을 맞춥니다.
면접관: 3NF와 BCNF의 차이는요?
지원자: 3NF는 비키 속성이 키에만 종속되어야 하고, BCNF는 모든 결정자가 후보키여야 합니다. 후보키가 아닌 결정자가 있으면 3NF는 만족하지만 BCNF는 위반합니다.
리뷰어: 주문 테이블에 상품 가격을 직접 저장하셨네요. 정규화 위반 아닌가요?
작성자: 의도적으로 그랬어요. 나중에 상품 가격이 바뀌어도 주문 당시 가격을 보존하려고요.
리뷰어: 좋은 판단이에요. 이런 경우는 비즈니스 요구사항에 따른 의도적 비정규화입니다. 주석으로 이유를 남겨두세요.