데이터베이스 설계에서 중요한 개념 중 하나는 정규화(Normalization)와 비정규화(Denormalization)입니다.
데이터베이스를 설계할 때, 데이터를 어떻게 구조화할 것인지에 따라 성능과 유지보수에 큰 영향을 미칠 수 있습니다.
1. 데이터 정규화 (Normalization)
정규화(Normalization)는 데이터베이스의 중복을 줄이고 데이터 무결성을 유지하기 위해 데이터를 구조화하는 과정입니다. 정규화를 통해 데이터를 여러 테이블로 분리하여 중복을 없애고, 효율적인 저장을 할 수 있습니다. 정규화는 주로 1NF(제 1 정규형)부터 5NF(제 5 정규형)까지 여러 단계로 나뉘며, 각 단계에서는 데이터의 일관성을 더욱 강화합니다.
정규화의 주요 목적
- 데이터 중복을 최소화
- 데이터 무결성 유지
- 검색 성능 향상
정규화의 단계
- 1NF (First Normal Form): 테이블의 각 컬럼은 원자값을 가져야 합니다. 즉, 한 컬럼에 여러 값을 저장하는 것은 피해야 합니다.
- 2NF (Second Normal Form): 1NF를 만족하면서, 기본 키와 관련된 부분 함수 종속성을 제거해야 합니다.
- 3NF (Third Normal Form): 2NF를 만족하면서, 이행적 함수 종속성을 제거해야 합니다.
예시: 정규화 전과 후
아래는 비정규화된 테이블 예시입니다. 이 테이블에서는 사용자 정보와 주문 정보가 하나의 테이블에 저장되어 있습니다.
CREATE TABLE orders (
order_id INT PRIMARY KEY,
user_name VARCHAR(100),
user_address VARCHAR(100),
product_name VARCHAR(100)
);
위 테이블을 3NF로 정규화하면, 사용자 정보와 주문 정보를 별도의 테이블로 분리할 수 있습니다.
CREATE TABLE users (
user_id INT PRIMARY KEY,
user_name VARCHAR(100),
user_address VARCHAR(100)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
user_id INT,
product_name VARCHAR(100),
FOREIGN KEY (user_id) REFERENCES users(user_id)
);
정규화를 통해 사용자 정보는 한 번만 저장되고, 여러 주문에 재사용될 수 있습니다.
2. 데이터 비정규화 (Denormalization)
비정규화(Denormalization)은 정규화된 데이터베이스 구조에서 일부 데이터를 중복하여 저장하는 과정입니다. 비정규화는 성능을 향상시키기 위해 주로 사용되며, 데이터베이스 쿼리에서 JOIN 연산을 줄이고 더 빠른 조회를 가능하게 만듭니다.
비정규화의 주요 목적
- 데이터 조회 성능 향상
- JOIN 연산을 줄여 성능 최적화
- 데이터베이스에 대한 쿼리 수 감소
비정규화의 예시
아래는 `users`와 `orders` 테이블을 결합하여 비정규화된 테이블 예시입니다. 이 테이블은 사용자와 주문 정보를 하나의 테이블에 저장하여 조회 성능을 빠르게 할 수 있습니다.
CREATE TABLE orders (
order_id INT PRIMARY KEY,
user_name VARCHAR(100),
user_address VARCHAR(100),
product_name VARCHAR(100)
);
위 예시에서 사용자는 여러 번 중복 저장되지만, 데이터를 조회할 때에는 JOIN 없이 빠르게 결과를 얻을 수 있습니다.
비정규화 사용 시 고려사항
- 데이터의 중복 저장으로 인해 데이터 일관성이 떨어질 수 있습니다.
- 데이터를 수정할 때 중복된 값을 모두 갱신해야 하므로 유지보수가 어려울 수 있습니다.
3. 정규화와 비정규화의 선택
정규화와 비정규화는 각각 장단점이 있습니다. 정규화는 데이터 무결성을 유지하는 데 유리하며, 비정규화는 성능을 향상시키는 데 유리합니다. 데이터베이스 설계 시 이 두 방법을 어떻게 사용할지는 애플리케이션의 요구 사항과 사용 패턴에 따라 결정해야 합니다.
정규화가 유리한 경우
- 데이터 무결성을 유지해야 하는 경우
- 중복 데이터를 최소화하고자 하는 경우
- 데이터 구조가 자주 변경되지 않는 경우
비정규화가 유리한 경우
- 데이터 조회 성능이 중요한 경우
- 빠른 읽기 성능을 요구하는 대규모 시스템
- 읽기 작업이 많은 경우
'개발 > DB' 카테고리의 다른 글
MySQL의 데이터 타입과 그 활용 (3) | 2025.07.30 |
---|---|
MySQL에서 데이터 무결성 보장 방법 (2) | 2025.07.29 |
MySQL의 ACID 속성 이해하기 (1) | 2025.07.27 |
MySQL에서 JOIN의 종류와 사용법 (1) | 2025.07.26 |
MySQL에서 JOIN의 종류와 사용법 (0) | 2025.05.25 |