데이터베이스 정규화 (Database Normalization)

데이터베이스 정규화는 관계형 데이터베이스의 설계를 체계화하고 최적화하는 과정.

정규화의 정의와 목적

정규화는 데이터의 중복을 최소화하고, 데이터의 무결성을 보장하며, 데이터베이스 구조를 더 유연하게 만드는 것을 목표로 한다.

주요 목적은:

  1. 데이터 중복 최소화
  2. 데이터 무결성 향상
  3. 데이터베이스 구조의 유연성 증대
  4. 데이터 일관성 유지
  5. 데이터 갱신 이상 현상 방지

정규화 단계

정규화는 여러 단계로 이루어지며, 각 단계를 정규형(Normal Form)이라고 한다:

  1. 제1정규형(1NF): 각 컬럼이 원자값을 가지도록 한다. 즉, 하나의 컬럼에 여러 값이 들어있으면 안 된다.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    
    -- 잘못된 예시
    CREATE TABLE contacts (
        id INT,
        name VARCHAR(100),
        phone_numbers VARCHAR(200)  -- "010-1234-5678, 02-123-4567"
    );
    
    -- 1NF를 만족하는 설계
    CREATE TABLE contacts (
        id INT,
        name VARCHAR(100)
    );
    
    CREATE TABLE contact_phones (
        contact_id INT,
        phone_number VARCHAR(20)
    );
    
  2. 제2정규형(2NF): 부분 함수적 종속을 제거한다. 모든 비주요 속성은 기본키 전체에 종속되어야 한다.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    -- 2NF 적용 전
    CREATE TABLE order_items (
        order_id INT,
        product_id INT,
        product_name VARCHAR(100),  -- product_id에만 종속
        quantity INT,
        price DECIMAL(10,2)
    );
    
    -- 2NF 적용 후
    CREATE TABLE products (
        product_id INT PRIMARY KEY,
        product_name VARCHAR(100)
    );
    
    CREATE TABLE order_items (
        order_id INT,
        product_id INT,
        quantity INT,
        price DECIMAL(10,2),
        FOREIGN KEY (product_id) REFERENCES products(product_id)
    );
    
  3. 제3정규형(3NF): 이행적 함수 종속을 제거한다. 비주요 속성들 간의 종속성을 제거한다.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    -- 3NF 적용 전
    CREATE TABLE employees (
        employee_id INT PRIMARY KEY,
        department_id INT,
        department_name VARCHAR(100),
        department_location VARCHAR(200)
    );
    
    -- 3NF 적용 후
    CREATE TABLE departments (
        department_id INT PRIMARY KEY,
        department_name VARCHAR(100),
        department_location VARCHAR(200)
    );
    
    CREATE TABLE employees (
        employee_id INT PRIMARY KEY,
        department_id INT,
        FOREIGN KEY (department_id) REFERENCES departments(department_id)
    );
    
  4. 보이스-코드 정규형(BCNF): 모든 결정자가 후보 키가 되도록 한다.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    -- BCNF 적용 전
    CREATE TABLE course_instructors (
        student_id INT,
        course_id INT,
        instructor_id INT,
        grade VARCHAR(2),
        PRIMARY KEY (student_id, course_id)
    );
    
    -- BCNF 적용 후
    CREATE TABLE course_assignments (
        course_id INT PRIMARY KEY,
        instructor_id INT
    );
    
    CREATE TABLE student_courses (
        student_id INT,
        course_id INT,
        grade VARCHAR(2),
        PRIMARY KEY (student_id, course_id),
        FOREIGN KEY (course_id) REFERENCES course_assignments(course_id)
    );
    
  5. 제4정규형(4NF): 다중값 종속성을 제거한다.

  6. 제5정규형(5NF): 조인 종속성을 제거한다.

정규화의 장점

  1. 데이터 중복 감소로 저장 공간 절약
  2. 데이터 일관성과 무결성 보장
  3. 데이터베이스 구조 개선으로 유지보수 용이성 증가
  4. 데이터 검색과 수정의 효율성 향상

정규화의 단점

  1. 테이블 간 조인 연산 증가로 인한 성능 저하 가능성
  2. 데이터베이스 설계의 복잡성 증가
  3. 특정 데이터 검색 시 여러 테이블을 거쳐야 하는 경우 발생

참고 및 출처