IT이야기/데이터베이스

제3정규형(3NF): 데이터 무결성을 보장하는 정규화 단계

Chiba-in 2025. 2. 28. 13:00

🔹 제3정규형(3NF)란?

1. 3NF(제3정규형)의 정의

제3정규형(3NF, Third Normal Form)은 제2정규형(2NF)을 만족하면서, 이행적 종속성(Transitive Dependency)을 제거하여 데이터 무결성을 더욱 강화하는 데이터베이스 정규화 단계입니다.

즉, 기본 키(Primary Key)가 아닌 모든 속성(Non-Key Attribute)은 오직 기본 키에만 의존해야 하며, 다른 비식별자 속성(Non-Key Attribute)에 종속되지 않아야 합니다.

3NF의 주요 원칙:

  • 테이블이 2NF(제2정규형)를 만족해야 함
  • 이행적 종속성(Transitive Dependency)을 제거해야 함
  • 기본 키(Primary Key)가 아닌 컬럼은 오직 기본 키에만 종속되어야 함

📌 3NF를 적용하면 데이터의 독립성을 강화하고, 수정 및 삭제 시 데이터 일관성을 유지할 수 있음


🔹 3NF를 충족하지 않는 테이블 예시

✔️ 2NF를 만족하지만 3NF를 위반하는 테이블

주문ID (PK) 고객ID (FK) 고객명 고객연락처 고객주소
101 1 홍길동 010-1111-2222 서울시 강남구
102 2 이영희 010-3333-4444 부산시 해운대구
103 1 홍길동 010-1111-2222 서울시 강남구

📌 문제점:

  • 고객명, 고객연락처, 고객주소는 주문ID가 아닌 고객ID에 종속됨 → 이행적 종속성 발생
  • 고객 정보를 변경할 경우 모든 주문 데이터를 수정해야 하는 수정 이상(Update Anomaly) 발생 가능
  • 고객 정보를 삭제할 경우 주문 데이터가 함께 삭제될 위험(삭제 이상)

🔹 3NF 적용 방법: 이행적 종속성 제거 및 테이블 분리

✔️ 3NF를 만족하는 테이블로 변환 (고객 정보 분리)

① 고객 테이블 (Customers)

고객ID (PK) 고객명 고객연락처 고객주소
1 홍길동 010-1111-2222 서울시 강남구
2 이영희 010-3333-4444 부산시 해운대구

② 주문 테이블 (Orders)

주문ID (PK) 고객ID (FK)
101 1
102 2
103 1

📌 해결 방법:

  • 고객 정보를 별도 테이블(Customers)로 분리하여 중복 제거
  • 각 비식별자 속성이 기본 키에만 종속되도록 설계 → 3NF 충족

🔹 3NF 적용을 위한 SQL 예제

✔️ 비정규화된 테이블 생성 (3NF 위반)

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    CustomerID INT,
    CustomerName VARCHAR(100),
    CustomerPhone VARCHAR(20),
    CustomerAddress VARCHAR(255),
    FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);

✔️ 3NF를 만족하는 테이블로 변환 (고객 정보 분리)

-- 고객 테이블
CREATE TABLE Customers (
    CustomerID INT PRIMARY KEY AUTO_INCREMENT,
    Name VARCHAR(100),
    Phone VARCHAR(20) UNIQUE,
    Address VARCHAR(255)
);

-- 주문 테이블
CREATE TABLE Orders (
    OrderID INT PRIMARY KEY AUTO_INCREMENT,
    CustomerID INT,
    FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);

📌 고객 정보를 Customers 테이블로 분리하여 중복을 최소화하고 데이터 무결성을 유지함


🔹 3NF의 장점과 단점

3NF의 장점

데이터 중복을 줄여 저장 공간 최적화
이행적 종속성을 제거하여 데이터 무결성 향상
삽입 이상, 수정 이상, 삭제 이상 방지
테이블 간 관계를 명확하게 정의하여 데이터 검색 성능 향상

3NF의 단점

테이블이 증가하면서 JOIN 연산 증가로 인해 성능 저하 가능성
복잡한 관계 설정으로 인해 SQL 쿼리 구조가 길어질 수 있음


🔹 3NF 실무 활용 사례

1. 전자상거래 시스템에서 고객, 주문, 상품 데이터 정규화

📌 문제:

  • 고객 정보를 주문 테이블에 함께 저장하면 중복 발생 및 수정 이상 문제 발생

📌 해결책:

  • 고객 정보(Customer), 주문 정보(Order), 주문 상세(OrderDetails) 테이블로 분리하여 3NF 적용

✔️ 정규화된 테이블 설계 (3NF 적용 후)

고객 테이블(Customers)
| 고객ID | 고객명 | 연락처 | 주소 |
|--------|--------|--------|--------|
| 1 | 홍길동 | 010-1111-2222 | 서울시 강남구 |
| 2 | 이영희 | 010-3333-4444 | 부산시 해운대구 |

주문 테이블(Orders)
| 주문ID | 고객ID | 주문일자 |
|--------|--------|--------|
| 101 | 1 | 2024-02-20 |
| 102 | 2 | 2024-02-21 |

📌 테이블을 분리하여 중복 제거 및 데이터 무결성 유지


📌 결론

제3정규형(3NF)은 데이터베이스 정규화의 세 번째 단계로, 2NF를 만족하면서 이행적 종속성을 제거하는 과정이다.
3NF를 적용하면 데이터 중복이 줄어들고, 데이터 무결성과 일관성이 향상된다.
고객, 주문, 상품과 같은 데이터가 포함된 시스템에서 3NF를 적용하면 데이터 관리가 더욱 효율적이다.
다만, 테이블이 증가하면서 JOIN 연산이 많아질 수 있으므로, 성능 최적화를 고려해야 한다.