?
사용자
데이터베이스 정규화(Normalization) 원칙과 적용 사례 가이드
데이터 무결성을 높이고 데이터 중복을 최소화하는 데이터베이스 정규화의 기본 원칙과 각 정규형(1NF, 2NF, 3NF)의 적용 사례를 학습합니다.
#database#normalization#db design#정규화#데이터베이스
recipe.md
데이터베이스 정규화(Normalization)란?
데이터베이스 정규화는 데이터베이스 설계 과정에서 데이터를 구조화하고 관계를 정의하여 데이터의 무결성을 높이고 불필요한 데이터 중복을 최소화하는 절차입니다. 이를 통해 데이터의 저장 공간 효율성을 높이고, 데이터 수정 시 발생할 수 있는 이상 현상(Anomaly)을 방지합니다.
왜 정규화를 해야 하는가?
- 데이터 중복 최소화: 동일한 데이터가 여러 곳에 저장되는 것을 방지하여 저장 공간을 절약합니다.
- 데이터 무결성 향상: 데이터 수정, 삽입, 삭제 시 발생할 수 있는 불일치나 오류를 줄입니다.
- 이상 현상(Anomaly) 방지: 데이터 중복으로 인해 발생하는 삽입 이상, 삭제 이상, 갱신 이상 현상을 예방합니다.
- 데이터베이스 유지보수 용이성: 구조가 명확해져서 데이터베이스를 이해하고 관리하기 쉬워집니다.
주요 정규형(Normal Forms)과 원칙
정규화는 여러 단계의 정규형으로 진행되며, 각 정규형은 특정 조건을 만족해야 합니다.
1차 정규형 (1NF: First Normal Form)
- 정의: 테이블의 모든 속성(컬럼)은 원자값(Atomic Value)을 가져야 하며, 반복되는 그룹이 없어야 합니다.
- 조건: 각 컬럼에는 하나의 값만 저장되어야 합니다. 즉, 한 셀에 여러 개의 값이 들어가거나, 동일한 엔티티에 대해 여러 컬럼이 반복되지 않아야 합니다.
- 예시: '주소' 컬럼에 '서울시 강남구 OO동 123-456'과 같이 하나의 값만 저장되어야 합니다.
2차 정규형 (2NF: Second Normal Form)
- 정의: 1NF를 만족하고, 기본 키(Primary Key)가 아닌 모든 컬럼은 기본 키 전체에 완전 함수 종속(Fully Functionally Dependent)이어야 합니다.
- 조건: 복합 기본 키(Composite Primary Key)를 사용하는 테이블에서, 기본 키의 일부에만 종속되는 컬럼이 없어야 합니다. 즉, 기본 키의 일부가 아닌 전체에 의해 결정되는 컬럼만 있어야 합니다.
- 예시:
(학생ID, 과목ID)가 복합 기본 키이고, '학생이름' 컬럼이 있다면, '학생이름'은 '학생ID'에만 종속됩니다. 이는 2NF 위반이므로, '학생' 테이블과 '수강' 테이블로 분리해야 합니다.
3차 정규형 (3NF: Third Normal Form)
- 정의: 2NF를 만족하고, 기본 키가 아닌 모든 컬럼은 기본 키에 이행적 함수 종속(Transitive Functional Dependent)되지 않아야 합니다.
- 조건: 기본 키가 아닌 컬럼이 다른 기본 키가 아닌 컬럼에 의해 결정되어서는 안 됩니다. 즉, 기본 키가 아닌 컬럼은 오직 기본 키에 의해서만 결정되어야 합니다.
- 예시:
학생ID가 기본 키이고,학생이름과학과명,학과장컬럼이 있다고 가정합니다. 이때학과명은학생ID에 의해 결정되고,학과장은학과명에 의해 결정될 수 있습니다. 이 경우학과장은학생ID에 이행적으로 종속되므로 3NF를 위반합니다. '학과' 테이블을 따로 만들어학과명과학과장을 관리해야 합니다.
정규화 적용 사례
상황: 온라인 쇼핑몰의 주문 관리 데이터베이스 설계
초기 설계 (비정규화):
Orders 테이블
| OrderID | CustomerID | CustomerName | OrderDate | ProductID | ProductName | ProductPrice | Quantity |
|---|---|---|---|---|---|---|---|
| 101 | C001 | 홍길동 | 2023-10-26 | P001 | 노트북 | 1200000 | 1 |
| 101 | C001 | 홍길동 | 2023-10-26 | P002 | 마우스 | 30000 | 2 |
| 102 | C002 | 김철수 | 2023-10-27 | P001 | 노트북 | 1200000 | 1 |
문제점:
- CustomerName, ProductName, ProductPrice 등이 중복됩니다.
- 특정 고객의 이름 변경 시 여러 행을 수정해야 하며, 누락 시 데이터 불일치가 발생합니다.
- 특정 상품의 가격 변경 시에도 마찬가지입니다.
정규화를 통한 개선 (3NF까지):
-
Customers 테이블 (고객 정보)
CustomerID (PK) CustomerName C001 홍길동 C002 김철수 -
Products 테이블 (상품 정보)
ProductID (PK) ProductName ProductPrice P001 노트북 1200000 P002 마우스 30000 -
Orders 테이블 (주문 헤더)
OrderID (PK) CustomerID (FK) OrderDate 101 C001 2023-10-26 102 C002 2023-10-27 -
OrderItems 테이블 (주문 상세)
OrderItemID (PK) OrderID (FK) ProductID (FK) Quantity 1 101 P001 1 2 101 P002 2 3 102 P001 1
개선 효과:
- 고객 정보, 상품 정보가 각 테이블에 한 번만 저장되어 중복이 제거되었습니다.
- 고객 이름이나 상품 가격 변경 시 해당 테이블의 한 행만 수정하면 됩니다.
- 데이터 무결성이 향상되었으며, 데이터 관리 및 유지보수가 용이해졌습니다.
주의사항
- 과도한 정규화: 정규화를 너무 많이 진행하면 테이블 수가 많아지고, 데이터를 조회할 때마다 여러 테이블을 조인(JOIN)해야 하는 오버헤드가 발생할 수 있습니다. 이는 성능 저하로 이어질 수 있습니다.
- 성능과의 균형: 실제 시스템에서는 성능 요구사항을 고려하여 역정규화(Denormalization)를 통해 일부 정규화 수준을 완화하기도 합니다.
- 비즈니스 요구사항: 정규화 수준은 데이터의 특성, 사용 패턴, 비즈니스 요구사항 등을 종합적으로 고려하여 결정해야 합니다.
5
스크랩
3
좋아요
0
댓글