CodeGym /행동 /SQL SELF /정규화의 장점과 단점

정규화의 장점과 단점

SQL SELF
레벨 26 , 레슨 4
사용 가능

오늘은 다시 한 번, 그리고 좀 더 자세하게, 중요한 주제인 정규화의 장점과 단점에 대해 얘기해볼게. 이걸 잘 이해하면 실제로 어떻게 적용되는지 감이 잡힐 거야. 자, 벨트 매고 시작하자!

데이터 중복 제거

테이블이 정규화되어 있지 않으면, 똑같은 정보가 여러 행에 반복될 수 있어. 예를 들어, 주문 테이블에 각 주문마다 고객 주소가 계속 반복될 수 있지. 정규화는 이런 중복을 없애고, 공통 데이터를 따로 테이블로 분리해.

예시:

-- 정규화 전
CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    customer_name TEXT,
    customer_address TEXT,
    order_date DATE
);

-- 정규화 후
CREATE TABLE customers (
    customer_id SERIAL PRIMARY KEY,
    customer_name TEXT,
    customer_address TEXT
);

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    customer_id INT REFERENCES customers(customer_id),
    order_date DATE
);

왜 이게 중요할까? 중복 데이터가 적으면 실수할 확률도 줄어들어. 만약 고객 주소가 바뀌면 한 군데만 고치면 되니까.

데이터 무결성 보장

데이터를 논리적으로 나눈 테이블로 관리하면, 관계를 쉽게 다룰 수 있어. 외래 키를 쓰면 데이터 무결성을 자동으로 유지할 수 있지. 예를 들어, 주문 테이블에서 참조하는 고객을 실수로 삭제하는 일이 없어.

예시:

-- 외래 키가 있어서 고객을 삭제하면 관련 주문도 같이 삭제됨
ALTER TABLE orders
ADD CONSTRAINT fk_customer FOREIGN KEY (customer_id)
REFERENCES customers(customer_id)
ON DELETE CASCADE;

이렇게 하면 데이터베이스 구조가 "고아" 데이터가 생기지 않게 막아줘.

업데이트 간소화

정규화된 데이터베이스는 업데이트가 쉽고 실수도 줄어들어. 다시 고객 예시로 돌아가면, 고객이 주소를 바꾸면 한 테이블에서만 수정하면 돼. 정규화 안 된 테이블에서는 몇몇 행을 빼먹고 수정 안 할 수도 있어서 데이터 불일치가 생길 수 있어.

이상 현상 최소화

삽입 이상: 정규화 안 된 테이블에서는 불필요한 정보 없이는 데이터를 추가할 수 없는 경우가 있어. 예를 들어, 고객 이름을 모르면 주문을 추가할 수 없어.

업데이트 이상: 데이터를 수정할 때 실수로 일부만 바꿀 수 있어. 예를 들어, 한 행에서만 고객 이름을 바꾸면 다른 행에는 옛날 이름이 남아있지.

삭제 이상: 데이터를 삭제하면 중요한 정보까지 같이 사라질 수 있어. 예를 들어, 주문을 삭제하면 고객 이름도 같이 없어질 수 있어, 만약 같은 테이블에 저장되어 있다면.

데이터 용량 감소

정규화는 보통 데이터베이스 크기를 줄여줘. 중복 데이터가 없어지니까, 대용량 데이터 저장에 특히 중요해.

정규화의 단점

1. 데이터베이스 구조가 복잡해짐

정규화를 계속하다 보면, 수천(!) 개의 테이블이 서로 연결된 복잡한 구조가 될 수 있어. 예전엔 한 테이블에서 바로 꺼내던 데이터를 이제는 여러 테이블을 JOIN해서 가져와야 해.

복잡성 예시:

-- 상품과 카테고리까지 포함해서 주문 정보 가져오기
SELECT
    o.order_id,
    o.order_date,
    c.customer_name,
    p.product_name,
    cat.category_name,
    oi.quantity,
    oi.unit_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
JOIN categories cat ON p.category_id = cat.category_id;

테이블과 관계가 많아질수록 쿼리 속도가 확 느려질 수도 있어.

2. JOIN이 많으면 성능 저하

테이블을 자주 JOIN하면 리소스를 많이 써. 특히 테이블이 크고 인덱스가 없으면 더 심하지. 분석 시스템처럼 수백만 행을 처리해야 할 때는 정규화가 성능에 큰 부담이 될 수 있어.

3. 비정규화 작업 필요

정규화된 구조를 분석용으로 쓸 때는, 쿼리 속도를 높이려고 임시로 비정규화해야 할 때가 있어. 예를 들어 VIEW나 집계용 테이블을 만들어서 데이터를 모아둘 수 있지.

예시:

-- 분석용 비정규화 VIEW 만들기
CREATE VIEW orders_with_customers AS
SELECT
    o.order_id,
    o.order_date,
    c.customer_name,
    c.customer_address
FROM
    orders o
JOIN
    customers c ON o.customer_id = c.customer_id;

4. 진입 장벽이 높음

초보자한테는 정규화가 어렵게 느껴질 수 있어. 모든 데이터를 한 테이블에 넣는 게 아니라 여러 테이블로 나눠서 관계까지 신경 써야 하니까. 데이터베이스 경험이 적은 팀이라면 개발 속도가 느려질 수도 있어.

5. 가끔은 중복이 더 나음

실제 프로젝트에서는 성능을 위해 일부러 중복 데이터를 남기는 게 더 나을 때도 있어. 예를 들어, 자주 쓰는 데이터를 복잡한 JOIN 없이 바로 꺼내야 한다면 한 테이블에 저장하는 게 더 빠를 수 있지.

1
설문조사/퀴즈
기존 데이터베이스 분석, 레벨 26, 레슨 4
사용 불가능
기존 데이터베이스 분석
기존 데이터베이스 분석
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION