데이터베이스 정규화는 데이터를 효율적으로 관리하고 데이터 중복과 불일치를 방지하기 위해 데이터베이스를 여러 단계로 분리하는 과정입니다. 각 정규화 단계에서 테이블의 구조가 어떻게 변화하는지 예시 데이터를 통해 설명드리겠습니다. ### 제1정규화 (1NF: First Normal Form) **제1정규화**는 테이블에 있는 모든 필드가 원자값(Atomic Value)을 가지도록 보장합니다. 즉, 각 칼럼은 하나의 값만을 가져야 합니다. #### 예시: 정규화 전의 테이블: | OrderID | CustomerName | ProductNames | |---------|--------------|--------------------| | 1 | Alice | Laptop, Mouse | | 2 | Bob | Keyboard, Monitor | 이 테이블은 `ProductNames` 칼럼에 여러 값이 포함되어 있으므로 제1정규형이 아닙니다. 제1정규화된 테이블: | OrderID | CustomerName | ProductName | |---------|--------------|-------------| | 1 | Alice | Laptop | | 1 | Alice | Mouse | | 2 | Bob | Keyboard | | 2 | Bob | Monitor | 이제 각 칼럼은 원자값을 가지므로 제1정규형입니다. ### 제2정규화 (2NF: Second Normal Form) **제2정규화**는 제1정규화가 적용된 상태에서, 부분적 함수 종속성을 제거하는 것입니다. 즉, 기본 키의 일부에만 종속된 속성을 제거합니다. #### 예시: 제1정규화된 테이블: | OrderID | CustomerName | ProductName | UnitPrice | |---------|--------------|-------------|-----------| | 1 | Alice | Laptop | 1000 | | 1 | Alice | Mouse | 50 | | 2 | Bob | Keyboard | 70 | | 2 | Bob | Monitor | 150 | 이 테이블에서 `CustomerName`은 `OrderID`에만 종속되어 있으므로, 부분적 종속성이 발생합니다. 제2정규화된 테이블: 1. **Order** 테이블: | OrderID | CustomerName | |---------|--------------| | 1 | Alice | | 2 | Bob | 2. **OrderDetail** 테이블: | OrderID | ProductName | UnitPrice | |---------|-------------|-----------| | 1 | Laptop | 1000 | | 1 | Mouse | 50 | | 2 | Keyboard | 70 | | 2 | Monitor | 150 | 이렇게 분리하여 부분적 함수 종속성을 제거한 것이 제2정규화입니다. ### 제3정규화 (3NF: Third Normal Form) **제3정규화**는 제2정규화가 적용된 상태에서, 이행적 함수 종속성을 제거하는 것입니다. 이행적 함수 종속성(Transitive Dependency)이란, 어떤 비기본 키 속성이 다른 비기본 키 속성에 종속될 때 발생합니다. #### 예시: 제2정규화된 테이블: | OrderID | CustomerID | CustomerName | CustomerAddress | |---------|------------|--------------|-----------------| | 1 | C001 | Alice | 123 Maple St. | | 2 | C002 | Bob | 456 Oak St. | 이 테이블에서 `CustomerName`과 `CustomerAddress`는 `CustomerID`에 종속되어 있지만, `OrderID`와는 이행적 종속 관계가 있습니다. 이를 제거하여 제3정규화를 수행합니다. 제3정규화된 테이블: 1. **Order** 테이블: | OrderID | CustomerID | |---------|------------| | 1 | C001 | | 2 | C002 | 2. **Customer** 테이블:\ | CustomerID | CustomerName | CustomerAddress | |------------|--------------|-----------------| | C001 | Alice | 123 Maple St. | | C002 | Bob | 456 Oak St. | 이렇게 이행적 종속성을 제거하여 제3정규형으로 만들었습니다. ### 제4정규화 (4NF: Fourth Normal Form) **제4정규화**는 다치 종속성(Multi-Valued Dependency)을 제거하는 것입니다. 하나의 테이블에 두 개 이상의 독립적인 다치 종속이 있는 경우, 이를 분리하여 여러 테이블로 나누는 것을 의미합니다. #### 예시: 정규화 전의 테이블: | StudentID | Course | Hobby | |-----------|-------------|-----------| | S001 | Math | Swimming | | S001 | Math | Reading | | S001 | History | Swimming | | S001 | History | Reading | 이 테이블에서 `Course`와 `Hobby`는 서로 독립적인 다치 종속 관계에 있습니다. 제4정규화된 테이블: 1. **StudentCourse** 테이블: | StudentID | Course | |-----------|---------| | S001 | Math | | S001 | History | 2. **StudentHobby** 테이블: | StudentID | Hobby | |-----------|----------| | S001 | Swimming | | S001 | Reading | 이렇게 두 개의 독립적인 다치 종속성을 분리하여 제4정규화가 이루어집니다. ### 요약 - **제1정규화**: 모든 속성이 원자값을 가져야 합니다. - **제2정규화**: 부분적 함수 종속성을 제거하여 테이블을 분리합니다. - **제3정규화**: 이행적 함수 종속성을 제거하여 테이블을 분리합니다. - **제4정규화**: 다치 종속성을 제거하여 테이블을 분리합니다. 이러한 정규화 과정을 통해 데이터베이스의 무결성을 유지하고, 중복 데이터를 최소화하며, 효율적인 데이터 관리를 할 수 있습니다.