?
사용자

데이터베이스 정규화(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 테이블

OrderIDCustomerIDCustomerNameOrderDateProductIDProductNameProductPriceQuantity
101C001홍길동2023-10-26P001노트북12000001
101C001홍길동2023-10-26P002마우스300002
102C002김철수2023-10-27P001노트북12000001

문제점:

  • CustomerName, ProductName, ProductPrice 등이 중복됩니다.
  • 특정 고객의 이름 변경 시 여러 행을 수정해야 하며, 누락 시 데이터 불일치가 발생합니다.
  • 특정 상품의 가격 변경 시에도 마찬가지입니다.

정규화를 통한 개선 (3NF까지):

  1. Customers 테이블 (고객 정보)

    CustomerID (PK)CustomerName
    C001홍길동
    C002김철수
  2. Products 테이블 (상품 정보)

    ProductID (PK)ProductNameProductPrice
    P001노트북1200000
    P002마우스30000
  3. Orders 테이블 (주문 헤더)

    OrderID (PK)CustomerID (FK)OrderDate
    101C0012023-10-26
    102C0022023-10-27
  4. OrderItems 테이블 (주문 상세)

    OrderItemID (PK)OrderID (FK)ProductID (FK)Quantity
    1101P0011
    2101P0022
    3102P0011

개선 효과:

  • 고객 정보, 상품 정보가 각 테이블에 한 번만 저장되어 중복이 제거되었습니다.
  • 고객 이름이나 상품 가격 변경 시 해당 테이블의 한 행만 수정하면 됩니다.
  • 데이터 무결성이 향상되었으며, 데이터 관리 및 유지보수가 용이해졌습니다.

주의사항

  • 과도한 정규화: 정규화를 너무 많이 진행하면 테이블 수가 많아지고, 데이터를 조회할 때마다 여러 테이블을 조인(JOIN)해야 하는 오버헤드가 발생할 수 있습니다. 이는 성능 저하로 이어질 수 있습니다.
  • 성능과의 균형: 실제 시스템에서는 성능 요구사항을 고려하여 역정규화(Denormalization)를 통해 일부 정규화 수준을 완화하기도 합니다.
  • 비즈니스 요구사항: 정규화 수준은 데이터의 특성, 사용 패턴, 비즈니스 요구사항 등을 종합적으로 고려하여 결정해야 합니다.
5
스크랩
3
좋아요
0
댓글