정규화
정처기할때 "도부이결다조" 로만 공부했던 정규화에 대해 알아보고자합니다..
정규화(Normalization)는 데이터베이스 설계에서 중복을 최소화하고 일관성을 유지하기 위해 데이터를 분해하는 과정입니다. 데이터베이스에서 중복된 데이터를 제거하고, 데이터 간의 관계를 명확하게 하기 위해 사용됩니다.
정규화의 목적
- 중복 최소화: 동일한 데이터가 여러 번 저장되는 것을 방지.
- 데이터 무결성 유지: 잘못된 데이터 입력을 방지.
- 수정 이상 방지: 데이터 수정 시, 다른 관련 데이터도 자동으로 수정되도록 한다.
비정규화 상태 (1NF 미만)
고객 주문 데이터베이스를 예로 들겠습니다. 하나의 테이블에 고객 정보와 주문 내용을 모두 저장한다고 가정해 봅시다.
고객ID | 고객명 | 주문1 | 주문2 | 주문3 |
001 | 홍길동 | 사과 | 배 | 바나나 |
002 | 김철수 | 딸기 |
위 테이블은 주문이 3개까지 가능하므로, 비정규화된 형태입니다. 고객이 4개 이상의 주문을 한다면 새로운 컬럼을 추가해야 하고, 중복된 고객 정보가 많이 발생할 수 있습니다.
제1정규형 (1NF)
1NF에서는 모든 컬럼이 원자값을 가지도록 데이터를 분리합니다. 즉, 주문 컬럼을 여러 개의 레코드로 나눕니다.
고객ID | 고객명 | 주문 |
001 | 홍길동 | 사과 |
001 | 홍길동 | 배 |
001 | 홍길동 | 바나나 |
002 | 김철수 | 딸기 |
이제 각 주문이 하나의 레코드로 분리되어 중복되는 데이터가 최소화되었습니다. 하지만 여전히 고객 정보가 중복됩니다.
제2정규형 (2NF)
2NF에서는 1NF의 조건을 만족하면서, 기본키의 부분집합에 의존하는 컬럼을 분리합니다. 고객 정보는 별도의 테이블로 분리하고, 주문 정보는 별도로 저장합니다.
고객 테이블
고객ID | 고객명 |
001 | 홍길동 |
002 | 김철수 |
주문 테이블
주문ID | 고객ID | 주문 |
1 | 001 | 사과 |
2 | 001 | 배 |
3 | 001 | 바나나 |
4 | 002 | 딸기 |
이렇게 하면 고객 정보가 중복되지 않으며, 고객과 주문을 효율적으로 관리할 수 있습니다.
제3정규형 (3NF)
3NF는 2NF를 만족하면서, 비기본키 컬럼 간에 의존성이 없도록 만듭니다. 예를 들어, 고객의 주소 정보가 고객 테이블에 포함되어 있을 경우, 주소와 고객명은 직접적인 관계가 없으므로, 주소는 별도의 테이블로 분리해야 합니다.
고객 테이블
고객ID | 고객명 |
001 | 홍길동 |
002 | 김철수 |
주문 테이블
주문ID | 고객ID | 주문 |
1 | 001 | 사과 |
2 | 001 | 배 |
3 | 001 | 바나나 |
4 | 002 | 딸기 |
주소 테이블
고객ID | 주소 |
001 | 서울시 강남구 |
002 | 부산시 해운대 |
이렇게 하면 모든 테이블은 기본키를 기준으로 데이터를 효율적으로 저장하며, 중복 데이터가 완전히 제거됩니다.
제4정규형 (4NF)
4NF는 **다치 종속성(Multivalued Dependency)**을 제거하는 정규화 과정입니다. 다치 종속성은 하나의 속성 값이 다른 여러 속성 값에 의존하는 경우를 의미합니다. 이를 해결하기 위해, 다치 종속성이 있는 속성들을 각각 별도의 테이블로 분리해야 합니다.
예시: 다치 종속성 문제
예를 들어, 한 고객이 여러 개의 전화번호와 이메일을 가질 수 있는 경우를 고려해 봅시다.
고객ID | 고객명 | 전화번호 | 이메일 |
001 | 홍길동 | 010-1234 | hong@email.com |
001 | 홍길동 | 010-5678 | hong2@email.com |
여기에서 전화번호와 이메일은 고객ID에 대해 다치 종속성을 가지고 있습니다. 즉, 고객이 여러 개의 전화번호와 이메일을 가질 수 있는 경우입니다. 이때, 전화번호와 이메일을 각각 별도의 테이블로 분리해야 4NF가 만족됩니다.
전화번호 테이블
고객ID | 전화번호 |
001 | 010-1234 |
001 | 010-5678 |
이메일 테이블
고객ID | 이메일 |
001 | hong@email.com |
001 | hong2@email.com |
이렇게 하면 다치 종속성을 해결하고, 고객ID에 대한 여러 값들이 독립적인 테이블로 분리되어 중복을 방지할 수 있습니다.
제5정규형 (5NF)
5NF는 **조인 종속성(Join Dependency)**을 해결하는 정규화 단계입니다. 이 단계는 데이터를 여러 개의 테이블로 분해하여 모든 관계를 명확히 하도록 합니다. 제5정규형에서는 조인 종속성이 발생하지 않도록 데이터를 나눕니다.
예시: 조인 종속성 문제
세 가지 속성, 즉 고객ID, 상품, 날짜를 가진 테이블에서, 한 고객이 여러 상품을 구매하고, 각 상품을 여러 날짜에 걸쳐 구매할 수 있다고 가정합니다.
고객ID | 상품 | 날짜 |
001 | 사과 | 2025-01-01 |
001 | 배 | 2025-01-01 |
002 | 바나나 | 2025-01-02 |
이 테이블에서 고객ID, 상품, 날짜는 모두 서로 연관된 값들입니다. 하지만 각 속성은 독립적으로 존재할 수 있으며, 이를 분리해야 합니다. 5NF에서는 이 데이터를 고객ID-상품, 고객ID-날짜, 상품-날짜로 분리할 수 있습니다.
고객ID-상품 테이블
고객ID | 상품 |
001 | 사과 |
001 | 배 |
002 | 바나나 |
고객ID-날짜 테이블
고객ID | 날짜 |
001 | 2025-01-01 |
002 | 2025-01-02 |
상품-날짜 테이블
상품 | 날짜 |
사과 | 2025-01-01 |
배 | 2025-01-01 |
바나나 | 2025-01-02 |
이렇게 분리하면 데이터베이스는 더 효율적으로 관리되고, 불필요한 중복을 방지할 수 있습니다.
결론
정규화는 데이터베이스 설계에서 필수적인 과정입니다. 이를 통해 중복을 최소화하고, 데이터 무결성을 유지할 수 있습니다. 각 정규형은 점진적으로 더 높은 수준의 효율적인 데이터 구조를 제공합니다.
'서버&백엔드 > 🗃️ SQL' 카테고리의 다른 글
관계형DB(RDB) vs 비관계형 DB(NoSQL) (0) | 2025.02.03 |
---|---|
nextval 중복된 키값이 고유제약조건을 위반하는 문제해결 (0) | 2024.09.02 |
DBeaver Functions Comment 표시설정하는법 (0) | 2024.08.07 |
PostgreSQL | 쿼리 성능 분석하기 (1) | 2024.07.03 |
추출한 CSV파일 채우기 드래그 한번에 하기 (0) | 2024.06.30 |