비정규화
Denormalization
의도적 데이터 중복으로 읽기 성능 향상.
Denormalization
의도적 데이터 중복으로 읽기 성능 향상.
비정규화(Denormalization)는 정규화된 데이터베이스에 의도적으로 중복 데이터를 추가하여 읽기 성능을 최적화하는 기법입니다. 정규화는 데이터 무결성을 보장하지만, 복잡한 조인으로 인해 쿼리 성능이 저하될 수 있습니다.
비정규화의 주요 전략으로는 중복 컬럼 추가(자주 조회되는 데이터 복사), 파생 컬럼 저장(계산된 값을 미리 저장), 테이블 병합(1:1 관계 테이블 통합), 요약 테이블 생성(집계 데이터 미리 계산) 등이 있습니다.
읽기 성능은 향상되지만, 데이터 일관성 유지를 위한 추가 로직이 필요하고 저장 공간이 증가합니다. OLAP 시스템, 리포팅 대시보드, 읽기 중심 API에서 주로 활용됩니다.
-- 정규화된 구조 (조인 필요)
SELECT o.order_id, c.customer_name, o.total
FROM orders o
JOIN customers c ON o.customer_id = c.id;
-- 비정규화된 구조 (중복 저장)
CREATE TABLE orders_denormalized (
order_id INT PRIMARY KEY,
customer_id INT,
customer_name VARCHAR(100), -- 중복 저장
total DECIMAL(10,2),
created_at TIMESTAMP
);
-- 파생 컬럼 예시: 주문 수와 총액 저장
ALTER TABLE customers
ADD COLUMN order_count INT DEFAULT 0,
ADD COLUMN total_spent DECIMAL(12,2) DEFAULT 0;
-- 트리거로 동기화 유지
CREATE TRIGGER update_customer_stats
AFTER INSERT ON orders
FOR EACH ROW
BEGIN
UPDATE customers
SET order_count = order_count + 1,
total_spent = total_spent + NEW.total
WHERE id = NEW.customer_id;
END;
백엔드 개발자: "대시보드 조회가 너무 느려요. 매번 5개 테이블 조인하니까..."
DBA: "비정규화해서 요약 테이블 만들까요? 주문 통계를 고객 테이블에 미리 계산해두면?"
백엔드 개발자: "데이터 동기화는 어떻게 하죠?"
DBA: "트리거나 배치 잡으로 갱신하고요, 실시간성이 중요하지 않으면 5분 딜레이 허용하는 것도 방법이에요."
면접관: "비정규화가 필요한 상황과 주의점을 설명해주세요."
지원자: "읽기 성능이 중요하고 쓰기 빈도가 낮을 때 적합합니다. 조인 비용을 줄이고 복잡한 집계를 미리 계산해둡니다. 다만 데이터 중복으로 인한 불일치 위험이 있어서 트리거나 애플리케이션 레벨에서 동기화 로직이 필수입니다."
면접관: "실제로 적용해본 경험이 있나요?"
지원자: "네, 리포팅 시스템에서 일별 매출 요약 테이블을 만들어 조회 시간을 8초에서 200ms로 줄인 경험이 있습니다."
리뷰어: "고객 테이블에 last_order_date 컬럼 추가하셨네요?"
개발자: "네, 최근 주문일 기준 고객 목록 조회가 자주 있어서 비정규화했습니다."
리뷰어: "좋아요. 근데 주문 삭제나 취소할 때 이 값 갱신하는 로직도 있나요?"
개발자: "아, 주문 취소 케이스를 놓쳤네요. 서비스 레이어에 동기화 메서드 추가하겠습니다."